Redis 介绍
Redis是什么?
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数 据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
Redis优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
windows下安装
- github下载或者官网下载,本人测试使用的是redis-64.3.0.503版本。
-
解压redis-64.3.0.503.zip,修改redis.windows.conf文件:
#指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。 maxmemory 1024000000 #设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭 requirepass 123456 bind 127.0.0.1 #主机ip,其他服务器连接此redis需要设置为0.0.0.0或者直接注释掉 port 6379 #端口号 dbfilename dump.rdb #指定本地数据库文件名 dir ./redisdata #指定本地数据库存放目录
-
启动redis:
# redis.windows.conf 是加载配置文件的意思,不写的话以默认的配置文件运行 redis-server.exe redis.windows.conf
另外开启一个命令行窗口 进入redis目录下
#连接本地redis不需要写-h -p redis-cli.exe [-h 47.96.103.25 -p 6379] # ping一下测试是否连接成功
-
安装完成Redis后,我们通常希望Redis能够像mysql一样在后台运行,运行下面命令将redis加入到windows的服务中。
redis-server --service-install redis.windows.conf --loglevel verbose
- 设置为windows服务 卸载、启动、停止、改名及端口服务
redis-server --service-install redis.windows.conf --loglevel verbose
redis-server --service-uninstall
redis-server --service-start
redis-server --service-stop
linux下安装redis
redis官网地址:http://www.redis.io/
-
下载对应版本
wget http://download.redis.io/releases/redis-4.0.8.tar.gz
-
解压
tar xzvf redis-4.0.8.tar.gz
-
安装
cd redis-4.0.8 #直接make 编译 make cd src/ #可使用root用户执行`make install`,将可执行文件拷贝到/usr/local/bin目录下。这样就可以直接敲名字运行程序了。 #make install # 安装后的所有资源文件都在/usr/local/redis目录下,方便灌流和卸载,但是不能在任何目录下运行,需要添加环境变量,我选择这种安装。 make install PREFIX=/usr/local/redis
- make根据Makefile中规定的内容进行编译,生成的可执行文件放在当前目录或某个子目录。
- make install将make生成的文件安装到系统目录中,如/usr/local/bin,这一步需要root权限,所以通常得用sudo makeinstall。如果没有这一步,在命令行中输入程序名字不能启动相应程序。
- make install可以使用PREFIX(一定要大写)=path指定生成文件的路径。
- /usr/local/bin和/usr/bin/等系统目录下的文件可以直接执行,不需要到相应的目录,相当于添加了环境变量。
-
移动配置文件到安装目录下
cd ../ mkdir /usr/local/redis/etc mv redis.conf /usr/local/redis/etc
- 后台启动redis
redis 默认是在前台运行,这样操作起来很不方便,通过设置redis.conf 可让redis在后台运行。
将daemonize no 改成daemonize yes
-
将redis加入到开机启动(自己选择加不加)
sudo vim /etc/rc.local 在里面添加
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf (意思就是开机调用这段开启redis的命令)
-
添加环境变量
root@iZbp1e036pdvwobr4d5fr2Z:~# vim /etc/profile .... export PATH=$PATH:/usr/local/redis/bin # 使用source命令使修改立刻生效: root@iZbp1e036pdvwobr4d5fr2Z:~# source /etc/profile
-
启动redis
#redis.conf路径要写,不然找不到。 redis-server /usr/local/redis/etc/redis.conf
-
常用命令
redis-cli -h 47.96.103.25 -p 6379 #连接远程数据库 pkill redis #关闭redis服务器 redis-cli shutdown #关闭redis服务器 quit #退出redis的客户端
-
卸载redis
#根据实际情况写目录 rm -rf /home/ray/redis-4.0.8 //删除redis解压文件夹 rm -rf /usr/local/redis //删除安装目录 rm -rf /usr/local/bin/redis-* //删除所有redis相关命令脚本
连接redis
redis-cli -h 47.96.103.25 -p 6379 #连接远程数据库
如果当前redis存在密码
-》 auth '密码'
配置文件说明
redis.conf 配置项说明如下:
- Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize no
- 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
- 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
port 6379
- 绑定的主机地址
bind 127.0.0.1
- 当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 300
- 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel verbose
- 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
- 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
databases 16
- 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
- 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
- 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
- 指定本地数据库存放目录
dir ./
- 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof
- 当master服务设置了密码保护时,slav服务连接master的密码
masterauth
- 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
requirepass foobared
- 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxclients 128
- 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory
- 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
- 指定更新日志文件名,默认为appendonly.aof
appendfilename appendonly.aof
- 指定更新日志条件,共有3个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)appendfsync everysec
- 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
vm-enabled no
- 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-swap-file /tmp/redis.swap
- 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
vm-max-memory 0
- Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
vm-page-size 32
- 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
vm-pages 134217728
- 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
vm-max-threads 4
- 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
glueoutputbuf yes
- 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
- 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)
activerehashing yes
- 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
include /path/to/local.conf
查看配置信息
redis 127.0.0.1:6379> CONFIG GET *
redis数据库值的类型
字符串 String
哈希 hash (散列函数,压缩映射,多个key对应一个value)
列表 list
集合 set
有序集合 sorted set
redis数据库 有16个库 0-15,默认0
string字符串
概述:String是redis最基本的类型,最大能存储512MB的数据,String类型是二进制安全的,即可以存储任何数据、比如数字、图片、序列化对象等概述:String是redis最基本的类型,最大能存储512MB的数据,String类型是二进制安全的,即可以存储任何数据、比如数字、图片、序列化对象等 key 对应 一个value
(1) 设置键值
set key value
47.96.103.25:6379> set name ray
OK
(2) 设置键值 并设置过期时间
setex key 时间 value
#设置过期时间为10秒
47.96.103.25:6379> setex age 10 18
OK
(3) 查看过期时间
ttl key
47.96.103.25:6379> setex age 10 18
OK
47.96.103.25:6379> ttl age
(integer) 8
47.96.103.25:6379> ttl age
(integer) 5
47.96.103.25:6379> ttl age
(integer) -2
47.96.103.25:6379> ttl age
(integer) -2
(4) 在key不存在时 则设置键值对 存在则不修改
setnx key value
47.96.103.25:6379> setnx age 22
(integer) 0
47.96.103.25:6379> get age
"20"
(5) 设置多个键值
mset key value key value
47.96.103.25:6379> mset name ray age 18
OK
(6) 获取一个值
get key
47.96.103.25:6379> get age
"18"
(7) 获取多个值
mget k1 k2 ....
47.96.103.25:6379> mget name age
1) "ray"
2) "18"
(8) 设置新值 并将旧值返回
getset key value
47.96.103.25:6379> getset age 20
"18"
(9) 将值+1
incr key
47.96.103.25:6379> incr age
(integer) 21
(10) 将值减1
decr key
47.96.103.25:6379> decr age
(integer) 20
(11) 将对应的key+整数
incrby key num
47.96.103.25:6379> incrby age 3
(integer) 23
(12) 将对象的key - 整数
decrby key num
47.96.103.25:6379> decrby age 3
(integer) 20
(13) 追加值
append key value
47.96.103.25:6379> append age 10
(integer) 4
47.96.103.25:6379> get age
"2010"
(14) 获取值的长度
strlen key
47.96.103.25:6379> strlen age
(integer) 4
(15) 获取所有的key
keys *
47.96.103.25:6379> keys *
1) "age"
2) "name"
(16) 获取某个键名开头的所有key
keys k*
47.96.103.25:6379> keys a*
1) "age"
(17) 获取以某个以某个字符结尾的key
keys *k
47.96.103.25:6379> keys *e
1) "age"
2) "name"
(18) 判断某个key是否存在
exists key
47.96.103.25:6379> exists age
(integer) 1
47.96.103.25:6379> exists age2
(integer) 0
(19) 查看key对应值的类型
type key
47.96.103.25:6379> type name
string
47.96.103.25:6379> type age
string
(20) 设置key的过期时间
expire key seconds
47.96.103.25:6379> expire age 10
(integer) 1
47.96.103.25:6379> ttl age
(integer) 5
47.96.103.25:6379> ttl age
(integer) 3
47.96.103.25:6379> ttl age
(integer) -2
(21) 查看key的过期时间 以毫秒返回
pttl key
47.96.103.25:6379> setex age 10 18
OK
47.96.103.25:6379> pttl age
(integer) 6623
47.96.103.25:6379> pttl age
(integer) 1348
47.96.103.25:6379> pttl age
(integer) -2
(22) 移除过期时间
persist key
47.96.103.25:6379> persist age
(integer) 1
47.96.103.25:6379> pttl age
(integer) -1
47.96.103.25:6379> pttl age
(integer) -1
47.96.103.25:6379> ttl age
(integer) -1
47.96.103.25:6379> get age
"18"
(23) 删除所有的key
flushdb 清除当前库的key
flushall 清除所有库的key
(24) 随机返回一个key
randomkey
47.96.103.25:6379> randomkey
"name"
47.96.103.25:6379> randomkey
"age"
47.96.103.25:6379> randomkey
"age"
hash
概述:hash用于存储对象
key1 : {
field1:v1,
field2:v2
...
},
key2 : {
field1:v1,
field2:v2
...
},
...
-
设置单个值
hset key field value
47.96.103.25:6379> hset key1 age 18 (integer) 1 47.96.103.25:6379> hget key2 age "16"
-
设置多个值
hmset key field1 v1 field v2...
47.96.103.25:6379> hmset key2 age 18 name ray OK
-
为hash中的某个field添加增量increment
hincrby key field num
47.96.103.25:6379> hincrby key2 age 2 (integer) 20
-
当field不存在的时候 则设置值
hsetnx key field value
47.96.103.25:6379> hsetnx key2 height 172 (integer) 1
-
获取一个属性的值
hget key field
47.96.103.25:6379> hget key2 age "20"
-
获取多个值
hmget key field1 field2...
47.96.103.25:6379> hmget key2 age name 1) "20" 2) "ray"
-
获取所有的字段和值
hgetall key
47.96.103.25:6379> hgetall key2 1) "age" 2) "20" 3) "name" 4) "ray" 5) "height" 6) "172"
-
获取所有的字段
hkeys key
47.96.103.25:6379> hkeys key2 1) "age" 2) "name" 3) "height"
-
获取所有的值
hvals key
47.96.103.25:6379> hvals key2 1) "20" 2) "ray" 3) "172"
-
返回字段的个数
hlen key
47.96.103.25:6379> hlen key2 (integer) 3
-
判断某个字段是否存在
hexists key field
47.96.103.25:6379> hexists key2 age (integer) 1 47.96.103.25:6379> hexists key2 age2 (integer) 0
- 删除字段和值
hdel key field...
47.96.103.25:6379> hdel key2 height
(integer) 1
列表
概述: 列表是一个简单的字符串列表 可以在列表的头部或者尾部插入内容
- 在头部插入值
lpush key value value....
- 在尾部插入
rpush key value....
- 为已存在的列表添加值
rpushx key value
- 在一个元素的前后插入新元素
linsert key before|after value value
注意
索引从0开始 0代表第一个 -1代表最后一个
- 设置指定索引元素的值
lset key index value
- 当key存在的时候 在头部添加数据(如果不成功 注意当前版本的问题)
lpushx key value ....
- 当key存在的时候 在尾部添加数据(如果不成功 注意当前版本的问题)
rpushx key value ....
- 将最后一个值弹出 并返回
rpop key
- 将第一个值弹出 并返回
lpop key
- 返回指定范围的元素
lrange key start end
lrang key 0 -1
- 裁剪列表
ltrim key start end
- 返回列表值的长度
llen key
- 返回列表中索引所对应的值
lindex key index
集合 set
概述: 无序集合 元素具有唯一性 不重复
{'a','b'}
- 添加值
sadd key member1 member2 ...
- 获取元素
smembers key
- 返回集合中元素的个数
scard key
- 随机删除集合中的一个元素
spop key
- 返回集合中一个或者多个的随机元素
srandmember key [num]
- 删除集合中的成员
srem key member1 member2...
- 求集合的交集
sinter key1 key2...
- 求集合的差集(注意谁和谁比较)
sdiff key1 key2...
- 求集合的合集
sunion key1 key2...
- 判断某个元素是否在当前集合中
sismember key member
有序集合 zset
概念:
- 有序集合 元素也是具有唯一性 不重复
- 每个元素通过score权重来去排序
- 添加元素
zadd key score member ....
- 获取
zrange key start end
- 返回元素的个数
zcard key
- 返回有序集合中 score权重 在min和max之间的元素的个数
zcount key min max
- 返回有序集合中 memeber的score值
zscore key member
- 返回当前所有的权重和值
zrange key start end withscores
数据库的切换
select 库名
注意: 默认进入数据库为 0库
Redis发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
实例
以下实例演示了发布订阅是如何工作的。在我们实例中我们创建了订阅频道名为 redisChat:
redis 127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
现在,我们先重新开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息。
redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"
(integer) 1
redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by runoob.com"
(integer) 1
# 订阅者的客户端会显示如下消息
1) "message"
2) "redisChat"
3) "Redis is a great caching technique"
1) "message"
2) "redisChat"
3) "Learn redis by runoob.com"
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。