redis的五大基本数据类型包括string、list、set、zset(sorted set)、hash;另外,三大特殊数据类型包括bitmap、geosaptial、HyperLoLog。本文旨在作个人学习记录,读者亦可作关于redis面试回答使用,内容简洁明了。部分内容参考JavaGuide。

1、string 

简介:

        string的数据结构是简单的key-value类型,虽然redis是用C语言写的,但string结构并无使用C的字符串表示,而是自己构建了一种简单动态字符串(Simple Dynamic String ,sds)。不仅可保存文本数据还可以保存二进制数据,除此之外,Redis 的 SDS API 是安全的,不会造成缓冲区溢出。

常用命令:set、get、mset(批量设置)、mget(批量获取)、exists(判断key存在与否)、incr(自增)、decr(自减)、setex(为key设置过期时间)、setnx(若不存在,则创建key)

应用场景: 一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等

2、list 

简介:

        Redis的list是双向链表,可实现栈、队列、阻塞队列的数据结构。

常用命令:lpush、lpop(左进左出)、rpush、rpop(右进右出)、lrange(list获取范围内的元素)、llen(查看元素个数)、linsert(插入)

应用场景:发布与订阅或者说消息队列、慢查询 

3、set

简介:

        set类似于java中的HashSet,集合内的元素无序不可重复。相对于list,set集合提供了判断某个成员是否存在的重要接口,并可实现交集、并集、差集操作。

常用命令:sadd、spop(添加、弹出)、smembers(查看所有成员)、sismember(判断某个成员是否存在)、scard(元素个数)、sinter、sunion、sdiff(交并差操作)等

      应用场景:可实现共同粉丝、共同关注、共同爱好等功能

 4、sorted set(zset)

简介:

        和set相比,sorted set多了个权重参数score ,使得集合中的元素能够按score进行有序排序,还可通过score的范围获取元素的列表。

常用命令:zadd、zrem(增加删除)、zcard(元素个数)、zrange(获取某一范围的元素)、zrevrange(升序获取)

应用场景:需要对数据根据权重进行排序的场景,如直播系统中,实时排行信息包括在线用户列表, 礼物排行榜、弹幕消息等

5、hash

简介:

        hash类似jdk1.8之前的HashMap,是一个string类型的key和value的映射表,特别适合存储对象。

常用命令:hset、hget、hmset、hmget(批量设置获取)、hkeys(获取所有key)、hvals(获取所有value)、hgetall(获取所有键值对)

应用场景:系统中关于对象的存储,如用户信息、商品信息等。 


                                        特殊数据类型介绍 


6、bitmap

简介:

        bitmap存储是连续的二进制数值(0和1),一个bit位可表示某个元素的值或状态。

常用命令:setbit、getbit、bitop(作位运算使用)、bitcount(返回二进制数值上1的个数)

应用场景:需要保存状态信息并进一步分析的场景,如用户签到情况、活跃用户情况、用户行为统计。 

7、geospatial 

简介:

        地理空间geospatial数据结构包含了经度,纬度,和名称。

常用命令:gadd、geodist(返回两个给定位置的直线距离)、geopos(返回成员的经纬度)、georadius(查找给定范围内的地理位置)

应用场景:实现微信位置共享,附近的人等功能 

8、hyperloglog

简介:

        用于统计唯一性事物的概率性数据结构,通常统计唯一性事物需要耗费成比例的内存空间,因为需要保存记录过的数据项,但hyperloglog 通过以精确度换内存空间(误差率小于1%),来统计唯一性事物数量。(常用命令略)

应用场景:实现记录每天在线人数、搜索词条数等功能