redis的使用
1️⃣ 切换数据库
- redis数据库默认共有16个 , 登陆时使用id为0的库
- 格式 :
select databasesid
, 例如 :select 0
,select 1
,select 2
…
2️⃣ 简单数据的数据添加和查找
- 添加数据 :
set key value
, 例如 :set FlowerName 牵牛
- 根据key , 查value :
get key
, 例如 :get FlowerName
3️⃣ key操作
- 查找所有的key :
KEYS *
- 查找指定的key是否存在 :
EXISTS key
- 给数据设置存活时间 , 时间到数据会被删除 :
EXPIRE key seconds
- 查看数据的存活时间 :
ttl key
- 将数据从当前数据库移动到其他数据库 :
MOVE key [0-15]
- 返回 key 所储存的value值的类型 :
Type key
- 删除数据 ,
DEL key
|DEL [key ...]
4️⃣ string操作
- 添加数据 , 格式 :
SET key value [EX seconds] [PX milliseconds] [NX|XX]
[EX seconds] : es 20 , 存活时间20秒
[PX milliseconds] : es 20 , 存活时间20毫秒
NX : key在数据库不存在 ,才能设置
XX : key在数据库已经存在了 , 才能设置
- 查询数据 :
GET key
- 追加数据 , 在value的值之后追加数据 ,
APPEND key value
- 查询value的长度
STRLEN key
- 将 key 中储存的数字值自增1
INCR key
INCR key increment
,INCR age 2
: 自增值为2 - 将 key 中储存的数字值自减 ,
DECRBY key decrement
- 从字符串截取一个子字符串 ,
GETRANGE key start end
, 但原key的value值不变
- 替换指定下标的字符
SETRANGE key offset value
- 设置生存时间 :
EXPIRE key seconds
- 如果key不存在 , 添加数据 :
SETNX key value
- 返回key的值 , key不存在会返回nil
MGET key [key ...]
MSET key value [key value ...]
同时设置一个或多个 key-value 对。
如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧
值,如果这不是你所希望的效果,请考虑使用 MSETNX 命令:它只会
在所有给定 key 都不存在的情况下进行设置操作。MSETNX key value [key value ...]
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都
不存在。
即使只有一个给定 key 已存在, MSETNX 也会拒绝执行所有给
定 key 的设置操作。
5️⃣ List 操作
将list当做一个队列
-1代表最后一位元素 , -2代表最后第二位元素 . . .
LPUSH key value [value ...]
从指定的队列的左边添加值 ,LPUSH list 1 2 3
=> [3 , 2 , 1]RPUSH key value [value ...]
向指定队列的右边添加值 ,RPUSH list a b c
=>[3 , 2 , 1 , a , b , c ]LRANGE key start stop
返回指定区间的元素 ,LRANGE list 0 1
=> [3 , 2]LPOP key
从指定队列左边开始移除并返回1位元素LPOP list
=>[2 , 1, a , b, c]RPOP key
从指定队列右边开始移除并返回1位元素RPOP list
=>[2,1,a,b]LINDEX key index
返回列表 key 中,下标为 index 的元素。LINDEX list 0
=>[2]LLEN key
返回指定队列的长度 ,LLEN list
=> 4LREM key count value
移除与参数value相等的元素
1️⃣ count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,操作数量为count 。
2️⃣ count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
3️⃣ count = 0 : 移除表中所有与 value 相等的值。LREM list 1 b
=> [2,1,a] : 移除list队列中值为b的元素 , 移除一位
LTRIM key start stop
只保留指定区间的元素, 其他元素移除 .LTRIM list 0 1
=>[2,1]RPOPLPUSH source destination
将source队列的最右侧元素移到destination队列的最左侧
list : [2,1] , list2 : [1]
PROPLPUSH list list2
=> list[1] , list2[2,1]LSET key index value
, 修改队列指定下标的值 ,LSET list2 0 3
=>[3,1]LINSERT key BEFORE|AFTER pivot value
, 在指定队列中 , 将value的值插入到pivot值的左侧或者右侧 .LINSERT list2 BEFORE 1 2
=> [3,2,1]
6️⃣ Set 操作
无序不可重复
-
SADD key member [member ...]
:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。假如 key 不存在,则创建一个只包含 member 元素作成员的集合。 -
SMEMBERS key
: 返回集合 key 中的所有成员。 -
SISMEMBER key member
:判断 member 元素是否是集合 key 的成员。 -
SCARD key
: 返回集合 key 的元素的数量。 -
SREM key member [member ...]
: 移除集合 key 中的一个或多个 member 元素. -
SPOP key
移除并返回集合中的一个随机元素。 (抽奖场景) ,
如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可
以使用 SRANDMEMBER 命令。 -
SMOVE source destination member
,将 member 元素从 source 集合移动到 destination 集合。
如果 source 集合不存在或不包含指定的 member 元素,则返回 0 。
source集合存在member元素时, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。当 source 或 destination 不是集合类型时,返回一个错误。 -
SDIFF key [key ...]
求差集:从第一个key的集合中去除其他集合和自己的交集部分 以第一个key为中心 -
SINTER key [key ...]
(微博求共同关注场景)
返回一个集合的全部成员,该集合是所有给定集合的交集。不存在的 key 被视为空集。当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。 -
SUNION key [key ...]
返回一个集合的全部成员,该集合是所有给定集合的并集。不存在的 key 被视为空集。 相同的value会去重 .
7️⃣ Sorted set 操作
类似 Sets,但是每个字符串元素都关联到一个叫 score 浮动数值。里面的元素总是通过 score 进行着排序,所以不同的是,它是可以检索的一系列元素。注意:在 set 基础上,加上 score 值,之前 set 是
key value1 value2….
现在 Zset 是 key score1 value1 score2 value2
-
ZADD key score member [[score member] [score member] ...]
将一个或多个 member 元素及其 score 值加入到有序
集 key 当中。
例如:ZADD score 10 xiaoming 20 xiaohua 30 xiaozhang
, xiaoming , xiaohua , xiaozhang都会有一个score值(10,20,30) , 可以根据这个值进行操作, 比如排序
-
ZRANGE key start stop [WITHSCORES]
查询。成员的位置按 score 值递增(从小到大)来排序。
具有相同 score 值的成员按字典序(lexicographical order )来
排列。 -
ZREVRANGE key start stop [WITHSCORES]
(音乐排行榜场景)
查询。其中成员的位置按 score 值递减(从大到小)来排列。 -
ZREM key member [member ...]
移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。 -
ZREMRANGEBYSCORE key min max
移除有序集 key 中,所有 score 值介于 min 和 max 之间 (包括等于 min 或 max )的成员。 -
ZSCORE key member
返回有序集 key 中,成员 member 的 score 值。 -
ZCARD key
返回有序集 key 的成员数量 -
ZCOUNT key min max
返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员数量。 -
ZRANK key member
返回有序集 key 中成员 member 的排名。其中有序集成员
按score值递增(从小到大)顺序排列。
8️⃣ Hash 操作 (散列)
Key,Value 模式不变,但是 Value 也是一个key,value键值对
HSET key field value
将哈希表 key 中的域 field 的值设为 value 。
例如:HSET xiaoli shengao 180
,HSET xiaoli age 18
HGET key field
返回哈希表 key 中 field 的value值。HMSET key field value [field value ...]
同时将多个 field-value对设置到哈希表 key 中。
此命令会覆盖哈希表中已存在的field。HMGET key field [field ...]
返回哈希表 key 中,多个field的值。HGETALL key
返回哈希表 key 中,所有的域和值。HKEYS key
返回哈希表 key 中的所有域field。HVALS key
返回哈希表 key 中所有的值。HSETNX key field value
将哈希表key 中的域 field 的值设置为 value ,仅当域 field 不存在。
若域 field 已经存在,该操作无效。HEXISTS key field
查看哈希表 key 中,给定域 field 是否存在。HDEL key field [field ...]
删除哈希表 key 中的一个或多个指定域.HINCRBY key field increment
为哈希表 key 中的域 field 的值加上增量 increment 。
增量也可以为负数,相当于对给定域进行减法操作。HINCRBYFLOAT key field increment
增加浮点数
场景:用户维度统计统计数包括:关注数、粉丝数、喜欢商品数、发帖数
用户为Key,不同维度为Field,Value为统计数
redis持久化
两种方式RDB和AOF , AOF要比RDB安全 , 但是AOF会保存你所有的操作信息 .
RDB
redis默认使用的就是RDB , 将数据落地到本地磁盘 , 默认数据储存在redis解压文件目录下的dump.rdb文件 .
- RDB缓存快照的设置 , 配置redis解压文件夹中的redis.conf
- 在
redid-cli
操作下使用命令SAVE
和BGSAVE
可以手动保存数据 .SAVE
会阻塞 ,BGSAVE
不会阻塞
redis在900秒内有1个key发生改变,在300秒内有10个key发生改变 或者在60秒内有10000个key发生改变的情况下会将数据保存到磁盘 .
也就是1分钟内如果key发生操作小于10000个 , 不保存 . 5分钟后只要有10个key被操作就保存. 如果还是没有达到 , 等到15分钟后 , 只要有1个key被操作就保存数据到到磁盘 . 举个栗子 , 你在1分钟的时候有9999条数据发生了改变 ,没被保存 , 但是没到5分钟的时候服务器挂了 , 9999条数据就丢了 , 所以使用redis应该要接受数据丢失 .
(RDB数据保存的格式)
AOF
记录操作日志 , 数据会保存到redis解压文件下的appendonly.aof文件中
(aof数据保存格式) , 如果你把del删掉 , 那么被命令删除的数据也可以恢复 .
-
AOF持久化配置方式,配置redis解压文件夹中的redis.conf
-
Appendfsync 参数:
Always 同步持久化 每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性较好。 (每次数据操作都持久化)
everysec: 出厂默认推荐,异步操作,每秒记录,日过一秒宕机,有数据丢失 (每一秒都持久化一下数据)
No:从不 fsync :将数据交给操作系统来处理。更快,也更不安全的选
择。 (交给操作系统的内核 ,写满之后flush到磁盘) -
Rewrite重写机制,对aof储存数据的优化
数据量到达64M , 压缩操作压缩到62M . 第二次压缩操作数据量是第一次的1倍(100%) , 数据量从62M到达128M是再压缩 , 第三次压缩就是256M
备份数据
就是将appendonly.aof或者dump.rdb拷贝一下 , 就可以在你数据丢失后可以把数据恢复 .
redis主从复制
- redis使用异步复制 . 2.8版本后, 服务器每秒一次向主服务器报告复制流的处理进度 .
- 一个主服务器可以多个从服务器 , 从服务器也可以由自己的从服务器 .
- 复制功能不会阻塞主服务器 , 也不会阻塞从服务器 , 只要在redis.conf文件中进行相应设置 ,及时从服务器正在进行初次同步 , 服务器也可以使用旧版本的数据集来处理命令查询 .
- 但是从服务器默认不许进行写操作.
- 从服务器删除旧版本数据集并载入新版本数据集的那段时间内 , 连接请求会被阻塞.
- 复制功能可以单纯的用于数据冗余 , 也可以通过让多个从服务器处理只读命令请求来提升扩展性 , 比如 , 繁重的SORT命令可以交给附属节点去运行 .
从服务器配置
临时配置:
- 主服务和从服务器都把自己的网卡打开 ,让别人能远程连接(换成服务器的本机ip) , 重启生效
- 从服务redis执行命令
slaveof 192.168.78.101 6379
, 通过主服务器的ip和端口连接即可 .
永久配置:
- 1 .临时配置的第一个步骤打开网卡
- 2 .从服务器redis.conf配置主服务器ip
通过配置让主服务器只有在至少N台从服务器的情况下 , 才被允许读写操作
- 1 . 主服务器配置redis.conf文件 ,
- min-slaves-to-write 3
:主服务器至少有3台从服务器
- min-slaves-max-lag 10
:这些服务器的延迟至少都低于10秒
redis服务器设置密码
- redis.conf文件设置本机密码
cli端连接时 通过 -a 跟服务器密码即可
- 集群环境下 , 想要从该服务器连接主服务器 , 就要在自己的redis.conf里配置所要连接的主服务器的密码 .
- 配置redis.conf文件 , 默认只允许127.0.0.1连接 , 注释则所有ip都可连接
哨兵机制
- 配置redis解压目录下的sentinel.conf文件
sentinel monitor mymaster 192.168.78.101 6379 2
:redis主服务器的ip和端口 , 哨兵找到主服务器就能自己找到所有从服务器, 2表示至少2台哨兵服务器认为redis挂了的时候进行鼓掌迁移sentinel down-after-milliseconds mymaster 30000
30秒服务器未响应, 哨兵认为redis挂了sentinel failover-timeout mymaster 180000
180秒时进行故障迁移的时间sentinel parallel-syncs mymaster 1
进行故障迁移时 , 最多有多少个从服务器同时对新的主服务器进行同步 .如果全部从服务器一起对新的主服务器进行同步, 会造成所有从服务器在短时间都不可用的情况protected-mode no
: 如果网卡没有打开的话 , 也可以通过关闭保护模式来让服务器之间互相通信
- 如何启动
- 启动redis主服务器和其他从服务器
- 配置好sentinel.conf的哨兵服务器 执行命令
redis-sentinel sentinel.conf
: redis-sentinel.conf文件在/usr/local/bin目录下 ,sentinel.conf文件在redis解压文件目录下 . - 注意你如果设置了密码,确保密码设置的逻辑正确 , 以保证主服务器挂掉之后故障迁移的新服务器也能被其他从服务器所连接 .
分布式redis集群
- 一个 Redis 集群包含 16384 个哈希槽(hash slot),数据库中的每个键都属于这 16384 个哈希槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽 (数据hash后 % 服务器的数量 = 数据存放服务器的位置) , 例如 hash % 16384 = 200 , 你有3台服务器 , 16384个卡槽被平均分给3台服务器 , 200的卡槽就位于第一台服务器 .
集群中的每个节点负责处理一部分哈希槽。 举个例子, 一个集群可以有三个哈希槽, 其中:- 节点 A 负责处理 0 号至 5500 号哈希槽。
- 节点 B 负责处理 5501 号至 11000 号哈希槽。
- 节点 C 负责处理 11001 号至 16384 号哈希槽。
这种将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点。 比如说:
- 如果用户将新节点 D 添加到集群中, 那么集群只需要将节点
A 、B 、 C 中的某些槽移动到节点 D 就可以了。 - 与此类似, 如果用户要从集群中移除节点 A , 那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C , 然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。
分布式redis集群的安装
- 我在集群中的每台服务器的rides解压目录下创建redis-cluster目录 , 在这个目录下新建7000和7001两个文件夹 , 防止备份数据的打乱 .
- 在7000目录下创建redis.conf文件 , 并写入配置
3 . 在7001目录下创建创建redis.conf文件 ,写入同2步骤相同的配置 , 将端口改为7001即可.
4 . 所有服务器都配置好之后启动集群 , 可以通过/usr/local/bin目录下的redis-server后面跟7000目录下的redis配置文件和7001目录下的redis配置文件启动 .redis-server redisc.conf
5 . 之后再所有服务器节点下执行如下三条命令安装相关程序 :
1️⃣yum install ruby
2️⃣yum install rubygems
3️⃣gem install redis-3.2.1.gem
6 . 通过以下命令来启动集群(将ip地址对应换成自己的即可, 不要使用ip地址别名 , 会有错误)
./redis-trib.rb create --replicas 1 192.168.78.101:7000 192.168.78.101:7001 192.168.78.102:7000 192.168.78.102:7001 192.168.78.103:7000 192.168.78.103:7001
命令的意义如下:
给定 redis-trib.rb 程序的命令是 create , 这表示我们
希望创建一个新的集群。
选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
之后跟着的其他参数则是实例的地址列表, 我们希望程序使用这些地址所指示的实例来创建新集群。简单来说, 以上命令的意思就是让 redis-trib 程序创建一个包含三个主节点和三个从节点的集群。
创建完之后用 redis-cli –c –p 7000来链接集群
springboot
##redis 配置
spring.redis.host=192.168.132.10
spring.redis.port=6399
spring.redis.password=123456
##集群环境哨兵
#spring.redis.cluster.nodes=102.168.132.16379