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

zscan

scan 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,哪天登录过?那几天没有登录?

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: