Redis学习:二、Redis五种基本数据类型的理解
Redis常用五大数据类型
redis有五大基本数据结构,分别是String、List、Set、Hash、Zset
String
String类型就是key-value都是字符串。而且二进制安全,所以String可以包含任何数据,比如jpg或者是序列化的对象。其中Value最大为512M。
String为简单动态字符串,是可以修改的字符串,结构上类似java的ArrayList,采用预分配冗余空间的方式减少对内存的频繁分配。当字符串小于1M的时候,扩容是加倍现有的空间,当字符串超过1M,则扩容一次只会扩1M的空间,此处指value。
String类型常用命令
其他: flushdb 清除数据库
set key value # 设置指定key的值
get key # 获取指定key的值
del key # 删除指定key的值
incr key # key自增1,只能对数字值操作,如果为空,新增值为1
decr key # key自减1,只能对数字值操作,如果为空,新增值为-1
incrby key k # 自定义步长 key自增k,如果key不存在,自增后get(key)=k
decrby key k # 自定义步长 key自减k,如果key不存在,自减后get(key)=-k
set key value # 不管key是否存在,都设置
setnx key value # key不存在,才设置
set key value xx # key存在,才设置
mget key1 key2 key3 # 批量获取key,原子操作
mset key1 value1 key2 value2 # 批量设置key-value
getset key newvalue # set key newvalue并返回旧的value
append key value # 将value追加到旧的value
List
List是一个字符串列表, 一个key对应多个value值,所谓单键多值。按照插入顺序排序。底层是双向链表,可以添加一个元素到列表的头部或者尾部,对两端操作性能很高,通过索引下标操作中间点的性能较差。
当列表元素较少的使用使用一块连续的内存存储,称作ziplist,压缩列表。当数据量比较多的时候才改成quicklist,quicklist是以一个一个小ziplist为双向链表节点的一个双向链表结构。这样设计,节省了指针空间。
List常用命令
lpush/rpush <key><value1><value2><value3> .. 从左边/右边插入一个或多个值
lpop/rpop <key> 从左边/右边吐出一个值
rpoplpush <key1><key2> 从<key1>列表右边吐出一个值,插到<key2>列表左边
lrange <key><start><stop> 按照索引下标获得元素(从左到右)
llen <key> 获得列表长度
linsert <key> before <value><newvalue>在<value>的后面插入<newvalue>插入值
lrem <key><n><value>从左边删除n个value(从左到右)
lset<key><index><value>将列表key下标为index的值替换成value
Set
Redis set的功能与List类似,是一个单键多值的列表,特殊之处在于set可以自动排重。当需要存储列表数据又不希望出现重复数据时(单键多值中不重复),set是一个很好的选择。
Set是String类型的无序集合,底层是一个value为null的hash表,所以说添加删除查找的复杂度都是O(1)
Set数据结构是dict字典,字典是用哈希表实现的。
Set常用命令
sadd <key><value1><value2> .....
将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
smembers <key> 取出该集合的所有值。
sismember <key><value> 判断集合<key>是否为含有该<value>值,有1,没有0
scard<key> 返回该集合的元素个数。
srem <key><value1><value2> .... 删除集合中的某个元素。
spop <key> 随机从该集合中吐出一个值。
srandmember <key><n> 随机从该集合中取出n个值。不会从集合中删除 。
smove <source><destination>value 把集合中一个值从一个集合移动到另一个集合
sinter <key1><key2> 返回两个集合的交集元素。
sunion <key1><key2> 返回两个集合的并集元素。
sdiff <key1><key2> 返回两个集合的差集元素(key1中的,不包含key2中的)
Hash
Redis hash是一个键值对集合,是一个String类型的field和value的映射表,hash特别适合于存储对象。类似java中的Map<String,Object>。
Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。
Redis Hash结构:
Key:用户ID
Hash:
- field
- 姓名标签
- 年龄标签
- 生日标签
- value
- 姓名数据
- 年龄数据
- 生日数据
通过key(用户ID)+field(属性标签)就可以操作对应属性的数据了。
Redis Hash常用命令
hset <key><field><value> 给<key>集合中的 <field>键赋值<value>
hget <key1><field> 从<key1>集合<field>取出 value
hmset <key1><field1><value1><field2><value2>... 批量设置hash的值
hexists<key1><field> 查看哈希表 key 中,给定域 field 是否存在。
hkeys <key> 列出该hash集合的所有field
hvals <key> 列出该hash集合的所有value
hincrby <key><field><increment> 为哈希表 key 中的域 field 的值加上增量 1 -1
hsetnx <key><field><value> 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .
Zset(sorted set)
Redis有序集合Zset和普通集合set很类似,是一个没有重复元素的字符串集合。不同的地方在于Zset每个成员(set中每个value)都关联的一个评分(score),这个评分用于从低到高排序集合中的成员。集合成员是唯一不重复的,但是评分可以重复。
因为元素有序,所以可以很快的根据评分和次序来获取一个范围内的元素。
访问有序集合的中间元素也很快,因此有序集合可以作为一个没有重复成员的智能列表。
Zset底层使用了两种数据结构
- hash:hash用来关联元素value和权重score,保障value的唯一性,也可以通过value找到对应的score值
- 跳跃表:跳表目的在于给元素value排序,根据score范围获取元素列表
Zset常用命令
zadd <key><score1><value1><score2><value2>…
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
zrange <key><start><stop> [WITHSCORES]
返回有序集 key 中,下标在<start><stop>之间的元素
带WITHSCORES,可以让分数一起和值返回到结果集。
zrangebyscore key minmax [withscores] [limit offset count]
返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
zrevrangebyscore key maxmin [withscores] [limit offset count]
同上,改为从大到小排列。
zincrby <key><increment><value>
为元素的score加上增量
zrem <key><value> 删除该集合下,指定值的元素
zcount <key><min><max> 统计该集合,分数区间内的元素个数
zrank <key><value> 返回该值在集合中的排名,从0开始。
本文作者:逐东
本文链接:https://www.cnblogs.com/vuds/p/16062580.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步