redis的使用场景
1、计数器
可以对string进行自增和自减,从而实现计数器的功能。
2、缓存
将热点数据缓存起来,同时设置内存的最大使用量和淘汰策略来保证缓存的命中率。
3、session服务器
使用redis作为统一的session服务器,则后端可以进行集群部署。
4、分布式锁的实现
在分布式场景下,无法使用单机环境下的锁来实现对多个节点上的进程进行同步,可以使用redis的SETNX(SET If Not Exists)命令,来实现分布式锁。
问题:在「执行setnx之后执行expire之前」用户进程意外crash,这个锁不久永远得不到释放了吗?
set指令有非常复杂的参数,可以同时把setnx和expire合成一条指令来用的!
「多个进程执行以下Redis命令:」
SETNX lock.foo <current Unix time + lock timeout + 1>
- 如果 SETNX 返回1,说明该进程获得锁,SETNX将键 lock.foo 的值设置为锁的超时时间(当前时间 + 锁的有效时间)。
- 如果 SETNX 返回0,说明其他进程已经获得了锁,进程不能进入临界区。进程可以在一个循环中不断地尝试 SETNX 操作,以获得锁。
5、共同好友
Set可以实现交集、并集等操作,从而实现共同好友等功能;
sadd key value //往集合添加元素,key是指向一个set
sinter key1 key2 ... //查询集合的交集
6、排行榜
ZSet可以实现有序性操作,从而实现排行榜等功能;(以访问量为分数进行排列)
7、附近的人、店铺
geohash地理空间索引。
- GEOADD: 将给定的位置对象(纬度、经度、名字)添加到指定的key;
- GEOPOS: 从key里面返回所有给定位置对象的位置(经度和纬度);
- GEODIST: 返回两个给定位置之间的距离;
- GEOHASH: 返回一个或多个位置对象的Geohash表示;
- GEORADIUS: 以给定的经纬度为中心,返回目标集合中与中心的距离不超过给定最大距离的所有位置对象;
- GEORADIUSBYMEMBER: 以给定的位置对象为中心,返回与其距离不超过给定最大距离的所有位置对象。
geoadd key longitude latitude member //经度-维度-成员,添加到指定的集合中。可以一个省一个集合
geoadd beijing 116.182881 39.72877 良乡大学城北
geoadd beijing 116.182881 39.72877 良乡大学城南
geoadd beijing 116.318427 39.986771 新东方大厦
geoadd beijing 116.319873 39.987953 中钢大厦
geodist 返回两个位置之间的距离
geodist beijing 新东方大厦 良乡大学城北 m //m为距离单位,km,mi,ft
geopos 返回指定位置的经纬度
geopos beijing 新东方大厦
georadius 返回以给定的经纬度为中心,长度范围内的成员。
georadius beijing 116.3180199 39.398575 100 km withcoord //withcoord指定返回的格式
georadiusbymember 返回指定成员长度范围内的其他成员。(可以实现附近的人)
georadiusbymember beijing 新东方大厦 20 km
8、基数统计
- HyperLogLog 是用来做基数估计的算法(是会存在偏差的)
- HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,「计算基数所需的空间总是固定的、并且是很小的。」
- 和布隆过滤器一样,HyperLogLog同样「不存储元数据,只做统计信息。」
- HyperLogLog是一种算法,并不是redis都用,是不过redis帮我们封装好了而已;
- 在 Redis 里面,每个 HyperLogLog 键只需要花费
12 KB
内存,就可以计算接近2^64
个不同元素的基数。 - **什么是基数:**比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
❝如果用set作统计,需要保护海量的数据,那内存还不炸了;
位图也可以做统计,尽管相比set内存消耗要少一些,但内存的消耗量还是很多;
❞
pfadd key element //添加元素到指定的HyperLogLog,不存在则返回1,存在则返回0
pfcount key //返回HyperLogLog的基数估算值
pfmerge key1 key2 ...//将多个HyperLogLog合并成一个
一般使用:统计数据量大,单条数据占用内存也大的情况,且允许存在误差。
- 统计注册 IP 数 (一个ip,4byte)
- 统计每日访问 IP 数
- 统计用户每天搜索不同词条的个数(词条就更大了)
本文使用 mdnice 排版