ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis 回想

2021-03-19 20:03:36  阅读:191  来源: 互联网

标签:缓存 KEYS Redis 数据库 回想 redis call key


1、Redis 各种数据类型的基本用法

String 普通字符串

Hash 类似于map

list 有序集合 还可以用作队列

set 无序集合,有去重效果

sorted set 有序去重集合

HyperLogLog 用于去重统计

更多命令:http://doc.redisfans.com/index.html

 

2、各种使用场景

1、热点数据缓存

比如分布式 session,热点查询数据的缓存。这个就比较简单了,查询数据时先从 redis 里查询,如果查到了直接返回,如果没有查到再从数据库查询,把查询结果缓存到 redis,然后再返回结果

注意点:

缓存的雪崩

当大量的 key 在同一时间过期时,大量的请求都直接访问到数据库,这时数据库可能扛不住压力崩溃,导致服务不可用。

所以尽量避免将大量的 key 设置一个相同的过期时间

缓存的穿透

缓存穿透指的是,请求一个数据库中不存在的记录时,先从缓存中取,取不到,就会访问数据库,结果数据库也查不到记录,所以这时也不会将结果放入缓存,下次请求还会去访问数据库。

这种情况我们可以把空结果缓存到 reids 中

这位大佬讲的很清晰 https://blog.csdn.net/u011277123/article/details/88757861

 

2、分布式锁

redis 有个命令:setnx key value 当值不存在时就设置值,后面还可以为这个key 设置一个过期时间(需要事务)

因为 redis 是单线程的,同时又有上面这个命令,而且它还是个内存数据库,读写速度快,所以很适合用作分布式锁

可以将一下代码在一个事务中执行 EVAL script numkeys key [key ...] arg [arg ...]

if (redis.call('exists', KEYS[1]) == 0)
    then redis.call('hset', KEYS[1], ARGV[2], 1);
    redis.call('pexpire', KEYS[1], ARGV[1]);
    return nil;
end;
if (redis.call('hexists', KEYS[1], ARGV[2]) == 1)
    then redis.call('hincrby', KEYS[1], ARGV[2], 1);
    redis.call('pexpire', KEYS[1], ARGV[1]);
    return nil;
end;
return redis.call('pttl', KEYS[1]);

用 hash 类型存制定的 key(即分布式锁的键),value 为 1,然后设置一个过期时间,

如果要设置的 key 已存在就把 value + 1,从这里可知,这是一个可重入锁

 

3、list类型实现消息队列

生产者 lpush 在左边加入消息

消费者 rpop 从右边消费消息

客户端需要轮询去消息。如果没有消息客户端会死循环,这样太消耗CPU,最好是每次 sleep(100) 一下

 

4、布隆过滤器 可以进行去重

参考 https://blog.csdn.net/u011277123/article/details/88757861

 

5、HyperLogLog 可以用于统计用户点击量

比如每有一个用户访问了某个接口我们可以把接口地址作为 key 用户的 id 作为 value,它可以自动去重记录总数量,不会保存用户的 id,所以占用空间较小,这也是为什么不用 set 来实现的原因。

 

6、幂等校验

比如有些接口不能重复提交,我们可以把接口名称和参数存入 redis,设置个过期时间。再收到相同的请求时,先查一下 redis 里是否存在,如果存在表示重复提交,拦截请求

 

 

标签:缓存,KEYS,Redis,数据库,回想,redis,call,key
来源: https://blog.csdn.net/qq_37278642/article/details/114949384

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有