Redis篇一之基础数据结构
Redis诞生于2009年全称是Remote Dictionary Server,远程词典服务器,是一个基于内存的键值型NoSQL数据库。具有基于键值型、单线程、低延迟、支持数据持久化、支持主从集群、分片集群和多语言客户端等特征。
Redis的数据结构
Redis的key一般是String类型,不过value的类型具有多样化,基础类型有String、Hash、List、Set、SortedSet, 特殊类型有GEO、BitMap和HyperLog
String类型****
常见命令:
命令 | 作用 |
---|---|
SET | 添加或者修改已经存在的一个String类型的键值对 |
GET | 根据key获取String类型的value |
MSET | 批量添加多个String类型的键值对 |
MGET | 根据多个key获取多个String类型的value |
INCR | 让一个整型的key自增1 |
INCRBY | 让一个整型的key自增并指定步长 |
INCRBYFLOAT | 让一个浮点类型的数字自增并指定步长 |
SETNX | 添加一个String类型的键值对,前提是这个key不存在,否则不执行 |
SETEX | 添加一个String类型的键值对,并且指定有效期 |
Hash类型
Hash类型类似Java的HashMap结构,可以将对象的每个字段独立存储,可以对某个字段进行单独操作。
常见命令:
命令 | 作用 |
---|---|
HSET key field value | 添加或者修改hash类型key的field的值 |
HGET key field | 获取一个hash类型key的field的值 |
HMSET | 批量获取多个hash类型key的field的值 |
HMGET | 批量获取多个hash类型key的field的值 |
HGETALL | 获取一个hash类型的key中的所有field和value |
HKEYS | 获取一个hash类型的key中的所有的field |
HVALS | 获取一个hash类型的key中的所有的value |
HINCRBY | 让一个hash类型key的字段值自增并指定步长 |
HSETNX | 添加一个hash类型的key的field值,前提是这个field不存在,否则不执行 |
List类型
List类型类似java的LinkedList,可以看成一个双向链表结构,既支持正向检索也支持反向检索。
常见命令
命令 | 作用 |
---|---|
LPUSH key element | 向列表左侧插入一个或多个元素 |
LPOP key | 移除并返回列表左侧的第一个元素,没有则返回nil |
RPUSH key element | 向列表右侧插入一个或多个元素 |
RPOP key | 移除并返回列表右侧的第一个元素 |
LRANGE key start end | 返回一段角标范围内的所有元素 |
BLPOP 和BRPOP: | 在没有元素时等待指定时间,而不是直接返回nil |
List可以用来模拟栈,只要入口和出口在同一边即可以。还可以用来模拟队列和阻塞队列。
Set类型
类似Java中的HashSet类似,具有无序、元素不可重复、查找快、支持交集、并集、差集等功能。
命令 | 作用 |
---|---|
SADD key member | 向set中添加一个或多个元素 |
SREM key member | 移除set中的指定元素 |
SCARD key | 返回set中元素的个数 |
SISMEMBER key member | 判断一个元素是否存在于set中 |
SMEMBERS | 获取set中的所有元素 |
sinter KEY1 KEY2 | 求key1与key2的交集 |
SDIFF key1 key2 | 求key1与key2的差集 |
SUNION key1 key2 | 求key1和key2的并集 |
SortedSet类型
是一个可排序的List集合,与Java的TreeSet类型类似,底层每一个元素都带有一个score属性,可以基于score属性对元素进行排序,底层的实现是一个跳表(SkipList)加hash表,具有可排序、元素不重复、查询速度快。
常见的命令有:
命令 | 作用 |
---|---|
ZADD key score member | 添加一个或多个元素到sorted set ,如果已经存在则更新其score值 |
ZREM key member | 删除sorted set中的一个指定元素 |
ZSCORE key member | 获取sorted set中的指定元素的score值 |
ZRANK key member | 获取sorted set 中的指定元素的排名 |
ZCOUNT key min max | 统计score值在给定范围内的所有元素的个数 |
ZINCRBY key increment member | 让sorted set中的指定元素自增,步长为指定的increment值 |
ZRANGE key min max | 按照score排序后,获取指定排名范围内的元素 |
ZRANGEBYSCORE key min max | 按照score排序后,获取指定score范围内的元素 |
lZDIFF、ZINTER、ZUNION | 求差集、交集、并集 |
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可
BitMap类型
Redis使用String类型来实现BitMap,最大上限是512M
常见命令有:
命令 | 作用 |
---|---|
SETBIT | 向指定位置存入一个0或1 |
GETBIT | 向指定位置(offset)的bit值 |
BITCOUNT | 统计BItMap为1的bit位的数量 |
BITFIELD | 操作(查询、修改、自增)BitMap中bit数组的指定位置(offset)的值 |
BITFIELD_RO | 获取BitMap中bit数组,并以十进制形式返回 |
BITOP | 将多个BitMap的结果做位运算(与、或、异或) |
BITPOS | 查找bit数组中指定范围内第一个0或1出现的位置 |
很适合用到签到功能的实现
HyperLogLog
Hyperloglog(HLL)是从Loglog算法派生的概率算法,用于确定非常大的集合的基数,而不需要存储其所有值。
Redis中的HLL是基于string结构实现的,单个HLL的内存永远小于16kb,内存占用低的令人发指!作为代价,其测量结果是概率性的,有小于0.81%的误差。不过对于UV统计来说,这完全可以忽略。
一般用来统计UV和PV,常见的命令有
PFADD key element:将指定元素添加到指定key的HLL中
PFCOUNT key: 统计这个key中的HLL数量
PFMERGE destkey sourcekey : 将多个sourcekey的元素都合并到destkey中。
总结
上面主要是列举了Redis的常见数据结构,除上述外还有一些高级用法,比如Stream流,PubSub的发布订阅消息队列和事务等,可以到Redis官网查看。