深入Redis进阶一

publish & subscription

基础回顾:之前我们使用list也能实现一个简单的消息队列rpush blpop
这个是不支持 一对多的消息分发 所以今天来学习Redis的发布订阅
channel:频道 subscribe 订阅者 publish发布者
命令:
subscribe channel-1 channel-2 channel-3
publish channel-1 message: 向指定的频道发布消息
psubscribe *sport
在Jedis客户端怎么使用?

transaction

例如:分布式锁:set del 原子性?

LuaScript

Redis中执行Lua脚本
redis>eval lua-script key-num key1… value1…
eval代表执行Lua脚本语言的命令,lua-script代表脚本内容;
key-num表示参数中key的个数,如果没有客源参数,那么就是0
key1…表示key最为参数传递给Lua语言内容,也可以不写但是key-num对应起来
value1…表示参数值 也可以不填

eval "return 'hello LuaScript'" 0
// result
"hello LuaScript"

在Lua脚本中执行Redis 命令:
redis.call(command, key[param1, param2…])
commamd是命令类型 包括set, get, del等
key是被操作的键,param代表给key的参数
通常不会这样直接写在命令行里面 会把Lua脚本写到文件里 redis-cli --eval my.lua 0

案例 对IP进行限流:在n秒之内之内访问m次
key: ip value: visit record
incrby m TTL expire time
vim ip-limit.lua
local num=redis.call(‘incr’, KEYS[1]);if tonumber(num==1) then redis.call(‘expire’, KEY[1],ARGV[1]) return 1
elseif tonumber(num)>tonumber(ARGV[2]) then return 0 else return 1 end
:wq
./redis-cli --eval “ip_limit.lua” app:ip:limit:192.168.1.111 , 6 10
如果redis的Lua脚本比加大 每次客户端 调用都要产生较大的网络开销 所以为了避免
可以在服务端把这个脚本 生成一个摘要 一个秘钥 让客户端执行调用
script load “return ‘hello LuaScript’” -->生成一个摘要
evalsha “生成的摘要” 0 -->这样就执行脚本
evalsha “生成的摘要” 1 num 6 -->12
如果Lua脚本超时咋办?
eval ‘while(true) return do en’ 0 -->进入死循环 其他客户端 再操作就会返回busy 使用script kill 直接中断那个死循环
如果死循环里面有set get 啥对值的操作 这个时候script kill 也不行
所以 只能用 shutdown nosave 直接停掉redis服务 会丢失之前操作的数据

数据淘汰与内存回收机制

过期策略
定时过期:到了key的过期时间 立即删除
惰性过期:key被访问的时候才判断是否过期 如果过期才删除
定期过期:每隔一段时阿金,清除一定数量的过期的key

如果达到了redis的内存上限?有哪些策略

LRU(Lastest Recently Used)/LFU(Least Frequently Used)
随机采样的算法,全局时钟server.lruclock serverCron 每隔100ms更新
对于LFU:key最后被访问的时间 被访问的频率(计数递增,也会有个递减)
计数的递增因子:lfu-log-factor 10 递增因子:lfu-decay-time 1

Redis的持久化机制
在机器宕机或者断电为了内存不丢失数据,redis提供了两种持久化机制 这个也是Redis跟memcahe的主要区别!
redis内存的数据在满足一定的情况下数据写入RDB的文件当中
RDB在什么情况下执行写入这些数据呢?
配置规则触发/shutdown/flushhall触发 snapshot 900 1 or 300 10 or 60 10000
手动触发:save/bgsave
RDB生成的文件路径:***/dump.rdb
RDB的特点:内容紧凑 不影响主进程 回复大数据集速度慢 同步频率
AOF默认不开启的 开启AOF之后 append only file 文件名默认appendonly.aof
AOF什么时候才会写入数据呢?先放入系统硬盘的缓冲区的内容什么时候会同步到AOF文件呢?
redis.config配置文件里面 appendsync everysec
AOF特点:同步频率 文件大小 性能 可以结合使用
如果对数据安全性可靠性要求不高 可以优先使用RDB 通常都是结合起来使用

猜你喜欢

转载自blog.csdn.net/blackxc/article/details/107837015