Redis | 使用场景

2,095 阅读4分钟

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 排版