Redis之父安特雷兹
redis x.x.x第二位是偶数的是稳定版本
redis7安装单机物理机安装:
https://blog.csdn.net/G189D/article/details/129185947
数据类型
bitmap
统计二值状态的数据类型
最大位数2^32位,他可以极大的节约存储空间,使用512M可以存储最多42.9亿的字节信息
setbit k1 2 1
getbit k1 2# 8位一组
strlen k1
# 统计
127.0.0.1:6379> setbit uid:login123 1 1
(integer) 0
127.0.0.1:6379> setbit uid:login123 2 1
(integer) 0
127.0.0.1:6379> setbit uid:login123 3 1
(integer) 0
127.0.0.1:6379> bitcount uid:login123
(integer) 3
127.0.0.1:6379> bitcount uid:login123 0 30
(integer) 3# 统计连续两天签到的用户
127.0.0.1:6379> setbit 20230101 0 1
(integer) 0
127.0.0.1:6379> setbit 20230101 1 1
(integer) 0
127.0.0.1:6379> setbit 20230101 2 1
(integer) 0
127.0.0.1:6379> setbit 20230102 1 1
(integer) 0
127.0.0.1:6379> setbit 20230102 2 1
(integer) 0
127.0.0.1:6379> bitcount 20230101
(integer) 3
127.0.0.1:6379> bitcount 20230102
(integer) 2
127.0.0.1:6379> bitop and k3 20230101 20230102
(integer) 1
127.0.0.1:6379> bitcount k3
(integer) 2
应用场景:统计用户活跃度
HyperLogLog
用来做基数统计算法,具有去重复功能统计网站UV(每天的独立访客ip唯一),PV
用户搜索网站关键词的数量
统计用户每天搜索不同词条个数# 统计 文章浏览量
127.0.0.1:6379> pfadd article:111 192.168.0.1
(integer) 1
127.0.0.1:6379> pfadd article:111 192.168.0.2
(integer) 1
127.0.0.1:6379> pfadd article:111 192.168.0.1
(integer) 0
127.0.0.1:6379> pfcount article:111
(integer) 2# 合并 两个文章的浏览量,这个合并是做了去重复操作的
127.0.0.1:6379> pfmerge distresutl article:111 article:222
127.0.0.1:6379> pfcount distresutl
(integer) 2
GEO
摇一摇附近的妹子
附近核酸点
附近商家
附近滴滴打车GEOADD city 116.403963 39.915119 "天安门" 116.403414 39.924091 "故宫" 116.024067 40.362639 "长城"
127.0.0.1:6379> type city
zset# 解决中文乱码问题
[root@ecs-56325218 ~]# redis-cli -a 111111 --raw
127.0.0.1:6379> zrange city 0 -1
天安门
故宫
长城# 返回经纬度
127.0.0.1:6379> geopos city 天安门 故宫
116.40396326780319214
39.91511970338637383
116.40341609716415405
39.92409008156928252
# hash编码
127.0.0.1:6379> geohash city 天安门 故宫
wx4g0f6f2v0
wx4g0gfqsj0
# 查询两地距离 m km
127.0.0.1:6379> geodist city 天安门 故宫 m
998.8332
127.0.0.1:6379> geodist city 天安门 故宫 km
0.9988# 附近的人
georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUS city 116.418017 39.914402 10 km withdist withcoord count 10 withhash desc
GEORADIUS city 116.418017 39.914402 10 km withdist withcoord withhash count 10 desc
GEORADIUSbymember city 天安门 10 km withdist withcoord withhash count 10 desc
持久化
RDB
指定时间间隔,执行数据集的时间点快照
默认自动触发(Redis7)不同之前(时间)
手动触发:调用save(阻塞,生产上禁用)命令或者bgsave(非阻塞)
关机的时候也会执行RDB
主从复制也会执行RDB
缺点:宕机可能存在数据丢失,不满足时间间隔
禁用RDB
配置文件 save ‘’
AOF
追加写操作
开启:配置文件 appendonly yes
自我优化,AOF重写(压缩文件)
回写策略:
1. Always:每步写回
1. every sec:每秒写会(默认)
1. no:写到缓冲区,具体由操作系统决定啥时写到磁盘
混合使用(生产)
AOF优先级高于RDB
1 开启混合方式设置
设置aof-use-rdb-preamble的值为 yes yes表示开启,设置为no表示禁用
2 RDB+AOF的混合方式---------> 结论:RDB镜像做全量持久化,AOF做增量持久化
先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。这样的话,重启服务的时候会从RDB和AOF两部分恢复数据,既保证了数据完整性,又提高了恢复数据的性能。简单来说:混合持久化方式产生的文件一部分是RDB格式,一部分是AOF格式。----》AOF包括了RDB头部+AOF混写
前提:必须开启AOF
纯缓存模式
同时关闭RDB+AOF
关闭RDB:save ‘’
关闭AOF:appendonly no
高级篇
Redis是单线程还是多线程
redis4之后才慢慢支持多线程,直到redis6/7后才稳定
Redis是单线程
主要是指Redis的网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求包括获取(socket读)、解析、执行、内容返回(socket写)等都一个顺序串行的主线程处理,这就是所谓的单线程。这也是Redis对外提供键值存储服务的主要流程
但Redis的其他功能,比如持久化RDB、AOF、异步删除、集群数据同步等等,其实是由额外的线程执行
Redis命令工作线程是单线程,但是,整个Redis来说,是多线程
多线程的优化命令
# 删除大key
unlink key
flushdb async
flushall async
Redis性能影响因素:CPU、内存、网络IO(主要)
redis7开启多线程(默认关闭):
可以加速网络处理,提高吞吐量
io-threads 4
io-threads-do-reads yes
BigKey
# MoreKey案例
# 生成100W条redis批量设置kv的语句(key=kn,value=vn)写入到/tmp目录下的redisTest.txt文件中
for((i=1;i<=100*10000;i++)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;cat /tmp/redisTest.txt | /opt/redis-7.0.0/src/redis-cli -h 127.0.0.1 -p 6379 -a 111111 --pipe# 生产上限制keys * / flushdb /flushall 等危险命令的误删误用,在redis.conf的SECURITY的一项中
rename-command key ""
rename-command flushdb ""
rename-command flushall ""scan 替换 keys *
scan
sscan
hscan
zscanscan curosr [pattern] [count]# 大key查询
redis-cli --bigkeys -a 111111 或者 memory usage key
# 如何删除
string unlink
hash 使用hscan 每次获取少量field-value,在使用hdel删除每个field
list ltrim
set 使用sscan 每次获取少量field-value,在使用srem删除每个field
zset 使用zscan 每次获取少量field-value,在使用ZREMRANGEBYRANK删除每个field
缓存双写一致性之更新策略探讨
- 高并发下,双检加锁
不能保证100%
-
利用mq的最终一致性(个人感觉这种方案比较好)
-
双写一致性canal监听
bitmap/hyperloglog/geo落地实现
hyperloglog
uv:独立访客,一般理解客户端ip(需要考虑去重)
pv:页面浏览量,不用去重
dau:日活跃用户量(登录或者是用来某个产品的用户数 去重复登录用户)
mau:月活越用户
geo
附近的人
bitmap
连续签到
最近一周的活跃用户
某个用户按照365,哪天登录过?那几天没有登录?