redis教程
redis教程,redis的基本类型
redis
安装
下载源码,tar、make make install
基本类型
基础的类型
- string
- list
- hash
- set
- zset
- 更高阶geo模块等(地理位置处理)
提示,使用redis-cli 有很多命令,都会有提示。
字符串操作
字符串是最基本的用途,程序中可以将各种数据dump为string保存到redis,它还能当作数字来操作,它还有二进制操作的功能,但最终是以二进值进制格式存储的。所以,也能存储图片等任何格式的内容。
通过观测保存为1的,二进值位,其为对应的ascii码。
数字操作
- incr
- incrby 增加步长参数
- decr
- decyby
- incrybyfloat
字符串操作
get 读取
getrange 返回子串。-1最后
append 追加,如果没有则视为在空字符串上增加。
getset
mget key1 key2 key3
mset key1 val1 key2 val2
setex key seconds value
设置有过期时间
psetex 同setex ,但是单位以毫秒计算。
setnx 即 set if no exists,不存在,才能设置成功。 setnx key value
msetnx 即使有一个key存在,则整体失败。
setrange 设置子串
strlen 计算value
二进制操作
getbit key index 索引从0开始
setbit key index (0|1) 设置
bitcount 统计功能 统计1的个数
bitop 即 bit operation ,二进制操作。可以简单的看作是二进制的运算。
以下示例 k3为写入的目标值,k1、k2为参与运算的两个参数。
and : bitop and k3 k1 k2
or : bitop or k3 k1 kv2
xor : bitop xor k3 k1 k2
not :bitop not k3 k1
bitpos 获取二进制位串中第一个1或0的位置
bitops key (0|1)
list 操作
list相当于一个数组一样,但是功能上,又很像一个队列。在实际应用过程中,有拿这个特性来作为队列,解耦两个系统。(确实有好处,比如两个系统之间,可能要发版,服务可能中断,但是作为中间件的redis一般从来也不会重启)
push, 从某一侧推入多个数据,如 lpush k1 v1 v2 v3
pop,从某一测推出1条数据。如 lpop k1 ,结果只返回1条数据。
lrange 查看,并不会影响到数据。指定范围,负数索引,表示的是从后往前。如lrange k1 0 -1,表示查看全部
trim 批量的删除一段。
l r 代表左右(有些命令无r开头的相关命令),b代表阻塞
具体的命令为
lpush rpush
lpop rpop
lindex 查看具体某个元素
lrange 查看范围
ltrim 范围批量操作
blpop 阻塞式列表弹出。(blpop key value timeout)
集合操作
集合,可以容量多个不同的元素,(元素无重复),它是一种无序的,所以,有一些操作的结果,可能是随机的。
该指令以s开头。
集合的增删改查
sadd 添加,sadd key val1 val2 ……
srem 删除,set remove , srem key va1 val2 … ,部分删除失败,剩余的也能正常执行。
sismember 判断是否是集合内的元素。集合本身不会变化。
scard 返回集合的长度。
smembers 返回整体内容。
srandmember 随机返回指定量的数据
spop 随机弹出一个。
smove 从一个集合移动到另外一个集合
集合运行
sdiff 集合的差集。
sdiffstore 保存集合的差集。
sinter 交集
sinterstore 保存交集
sunion 并集
sunionstore 保存并集
散列
散列我个人感觉,跟编程语言里面的map、字典等概念很像。散列就像一个微缩版的redis。
指令以h开头。
hget 获取值。
hset 设置,好像也能批量设置。
hmset 批量设置
hmget 批量获取
hdel 删除指定的键
hsetnx 不存在,才能设置成功。
hvals 相当于获取
hkeys 获取哈希集中的keys
hgetall 获取全部的数据
hexists 判断是否存在
hincrby
hincrbyfloat
hlen
hstrlen
有序集合
指令以z开头。对比集合set来用,区别增加了score。
zaddd 添加
zscore 返回score. zscore k1 v1
zrange z1 0 -1 [wthscores]
zrevrange 跟zrange一样的功能,但顺序是相反的。 rev = reverse
zcard 集合长度
zcount 统计指定score范围内的元素。
zrangebyscore
zrank 返回有序集合key中成员member的排名。
zrevrank 功能同zrank,逆序。
zincrby
zinterstore # 集合运行
zrem
zlexcount
zrange
zrangebylex
geo
https://blog.csdn.net/a594566609/article/details/117445950
https://www.runoob.com/redis/redis-geo.html
发布订阅和事务
发布订阅
订阅消息
订阅消息
subscribe c1 c2 c3
模式匹配订阅
psubscribe c*
发布消息
publish c1 “hello world”
缺点
如果断线重连,则断线阶段的数据,可能会丢失。
事务
multi
开启事物
exec
执行事物
discard
放弃,清空任务队列。
事务中的异常情况,
1、进入队列之前就能发现错误,比如命令输入错误。(高版本的redis会自动放弃这个事务。)
2、执行exec之后才能发现的错误。比如给一个非数字字符加1。(某个命令执行错误,但其他的命令仍会被执行)
watch,事务中的watch命令,可以用来监控一个key,通过这种监控,redis提供的cas的行为。
快照持久化
两种:1、快照持久化。2、AOF。快照的作用,是将redis里面的数据持久化,这样,及时重启redis或者更换机器,数据不丢失。
快照持久化的配置。
save 900 1
save 300 10
save 60 10000
900秒超过1次操作,触发保存。300秒超过10次操作,触发保存。类推……
其他,shutdown会触发,也会触发。
快照持久化的缺点
save会阻塞,bgsave不会阻塞。定期持久化也还会存在丢失数据的风险。bgsave会fork出一个进程,处理持久化。
AOF持久化
设置。
appendonly yes
# 3种选项
appendfsync always|everysec|no
# 备份文件的名称
appednfilename "appendonly.aof"
appendfsync
always ,会严重的降低redis的性能。
everysec时,严重的时候,可能会丢失1秒种的数据。
Aof的重写与压缩
bgrewriteaof 进行重写。原理同bgsave。
bgrewriteaof自动执行配置:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
以上64M为默认配置,工程实践,一般设置5G。
最佳实践
1、如果redis只做为缓存服务器,则可能不使用任何持久化方式。
2、两种持久化同步使用。
3、建议salve上,配置只保留 save 900 1。即15分钟持久化一次。
4.EnableAof,好处是,最恶劣情况下会丢失2秒数据。aof rewirte设置5G触发。
主从复制(1主多从)
起3个实例(复制配置,并修改端口等配置。)。
redis-cli 登录另外两个从节点,执行如下命令。
slaveof 127.0.0.1 6379
info replication
主从复制注意点
1、主节点运行一段时间后,从节点连上,会将主节点所有的数据备份。
2、主节点:可读可写,从节点:只读。可以通过设置(replica-read-only yes) (slave) ?来达到从节点可读可写。
3、主节点挂掉,重启后,依然是主节点。
复制原理
主从复制(1主1从1从)
一主接点,然后增加从节点,再给从节点,增加一个从节点。
哨兵模式
主动模式,如果主节点挂掉,就群龙无首。故哨兵模式,是为了解决这种情况,监控主节点的运行情况,如果主节点挂掉后,立马重新选举出新的主节点。
配置
redis-sentinel sentinel.conf
sentinel monitor mymaster 127.0.0.1 6379 1
# 说明
# mymaster 为主节点起的名字
# ip port 主节点的信息
# 1 有多少个认为主节点挂掉了
redis集群
数据会按照crc16算法,对key进行hash,然后区16384求余,分哈希槽。redis会根据节点数量大致均等的将哈希槽映射到不同的节点上。
主节点状态
ruby环境。
yum install ruby
yum install rubygems
高版本已经可以使用redis-cli来创建集群。
# 创建集群
redis-cli --cluster create 192.168.131.130:6381 192.168.131.130:6382 192.168.131.130:6383 192.168.131.130:6384 192.168.131.130:6385 192.168.131.130:6386 --cluster-replicas 1
# 检查集群
redis-cli -p 6381 -c -c
cluster info
redis-cli --cluster check 172.17.0.15:6381
应用场景
缓存场景
拿redis当做缓存,使用到string类型。
位操作
利用位操作,节省空间。
队列场景
使用list,将数据从队列的一侧推入,另外一侧弹出。
hash存储,聚合数据
以运单号为主键,然后将相同的单号的数据,写到同一个hash中。