Redis 中的数据类型以及常用方法

👨🎓作者:Java 学术趴
💌公众号:Java 学术趴
🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。
🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号 Java 学术趴联系小编。
☠️每日毒鸡汤:这个社会是存在不公平的,不要抱怨,因为没有用!人总是在反省中进步的!
2.2 Redis 中针对 key 的操作
2.2.1 Redis 中对于键(key)的操作
- set key key 值 :设置一条数据,key: 键名,key 值:这个 key 对应的值 
- keys :查看当前库下所有的 key。 
- exists key : 判断某个 key 是否存在。 
- type key : 查看某个 key 是什么类型。 
- del key : 删除指定的 key 数据。 
- unlink key :根据 value 选择非阻塞删除,仅将 keys 从 keyspace 元数据中删除,真正的删除会在后续异步操作。 
- expire key 10 : 为指定的 key 设置过期时间, 10 秒钟后删除 
- ttl key : 查询还有多少秒过期, -1 代表永不删除,-2 代表已过期。 
- select 数据库编号 :切换数据库。 
- dbsize : 查看当前数据库的 key 数量。 
- flushdb : 清空当前数据库。 
- flushall : 删除全部数据库中的数据。 
2.3 Redis——String 类型的数据
2.3.1 String 类型简介
- String 是 Redis 中最基本的数据类型,一个 key 对应一个 value。 
- String 类型是二进制安全的,意味着 Redis 的 String 可以包含任何数据。比如:jpg 图片或者是序列化对象。 
- String 类型是 Redis 中最基本的数据类型,一个 Redis 中字符串 value 最多可以是 512M。 
2.3.2 常用命令
- set <key><value> : 添加键值对。 
 
 EX : 当数据库中的 key 不存在时,可以将 key-value 添加数据库。
XX : 当数据库中 key 存在时,可以将 key-value 添加数据库,与 NX 参数互斥。
EX : key 的超时秒数。
PX : key 的超时毫秒值,与 EX 互斥。
- get <key> : 查询对应的键值。 
- append <key><value> : 将给定的<value>追加到原值的末尾。 
- strlen<key> : 获取键值的长度。 
- setnx <key><value> : 只有在 key 不存在时,设置 key 的值。 
- mset<key1><value1><key1><value1> : 同时设置一个或者多个 key - value 对。 
- mget<key1><key2> : 同时获取一个或者多个 value。 
- msettnx<key1><value1><key2><value2> : 同时设置一个或多个 key-value,当且仅当 所有给定的 key 都不存在的时候,但凡有一个存在就不会进行创建(原子性)。 
- getrange<key><起始位置><结束位置> : 获取值的范围,类似 Java 中的 substring ,范围是闭区间,前后都包含。 
- setrange<key><起始位置><value> : 从起始位置开始添加新的 value 到旧的 value 中,形成一个新的 value。 
- setex<key><过期时间><value> : 设置键值的同时,设置过期时间, 单位为:秒 
- getset<key><value> : 以旧换新,获取旧值的同时设置新值。 
注意:以下四个命令只会对数字值进行生效。
- incr <key> : 将 key 中存储的 数字值 增加 1,如果为空,则新增值为 1。 
- decr <key> : 将 key 中存储的 数字值 减少 1,如果为空,则新增值为 -1 
- incrby <key><步长> : 将 key 中存储的数字值增加指定的长度,可以自定义步长。 
- decrby <key><步长> : 将 key 中存储的数字值减少指定的长度,可以自定义步长。 
2.3.3 String 类型的底层数据结构
- String 的数据结构为简单动态字符串(Simple Dynamic String,缩写 SDS)。是可以修改的字符串,内部结构是实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。需要注意最大之呢个存储 512M 大小的字符串。 
 
 2.4 Redis——List 列表类型的数据
2.4.1 简介
列表存储数据的模式:单键多值
- String 类型中 value 只是一个字符串,叫做单值。List 类型中的 value 是多个字符串组合成的一个列表。 
- Redis 列表是简单的字符串列表,按照插入的顺序排序存储,你可以添加一个元素到列表的头部或者尾部。 
- 它的底层其实是一个 双向链表,对两端的操作性能很高,通过索引下标操作中间节点的效率会很低。 
2.4.2 常用命令
- lpush/rpush<key><value1><value2><value3> : 从左边/右边插入一个或者多个值。 
- lpop/rpop<key> : 从左边/右边吐出一个值。 值在键在,值光键亡 
- rpoplpush<key1><key2> : 从 <key1> 列表右边吐出一个值,插入到 <key2> 列表左边。 
- lrange<key><start><stop> : 按照索引下标获得元素, 从左到右,下标从 0 开始。 
- lrange <key> 0 -1 : 0 左边第一个,-1 右边第一个,该命令可以获取全部数据。 
- lindex <key><index> : 按照下标获取指定的元素,从左到右。 
- llen <key> : 获取列表长度。 
- 。insert<key> before <value><newvalue> : 在 <value>的后面插入新的值<newvalue>。 
- lrem<key><n><value> :从左边删除 n 个 value 值(从左到右)。 
- lset<key><index><value> : 将列表 key 下表为 index 的值替换成 value。 
2.4.3 数据结构
List 的数据结构为快速链表 quickList
- 首先在列表元素较少的情况下会使用一块链接的内存存储,这个结构是 ziplist ,也即使压缩列表。 
- 它将所有的元素紧挨着一起存储,分配的是一块连续的内存。 
- 当数据量比较多的时候会改成 quicklist,以下就是一个 quicklist,它是由多个压缩列表 ziplist 构成的。 
 
 - Redis 将链表和 ziplist 结合起来组成了 quicklist。也就是将多个 ziplist 使用双向指针串起来。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。 
2.5 Redis——Set 集合类型的数据
2.5.1 简介
- Redis 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以 自动去重 的,当你需要存储一个列表数据,又不希望数据重复的时候,set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也就是 list 不能提供的。 
- Redis 的 set 是 String 类型的无序集合。 它的底层其实是一个 value 为 null 的 hash 表,所以添加、删除、查找的复杂度都是 o(1)。 
- 一个算法,随着数据的增加,执行时间的长短是动态变化的。如果是 o(1),数据增加,查找数据的时间不变。 
2.5.2 常用命令
- sadd<key><value1><value2> : 将一个或者多个元素添加到集合 key 中,已经存在的元素将被忽略。 
- smembers<key> : 获取到集合中所有的元素。 
- sismember<key><value> : 判断集合<key>中是否含有该<value>值,有返回 1,没有返回 0. 
- scard<key> : 返回该集合的元素个数。 
- srem<key><value1><value2> : 删除 key 集合中的指定元素。 
- spop<key> : 随机从 key 集合中吐出一个值,会从集合中删除,如果全部取出,key 消失。 
- srandmember<key><n> : 随机从 key 集合中取出 n 个值,不会从集合中删除。默认是随机获取一个。 
- smove<key1><key2><value> : 把集合中一个值从一个集合移动到另一个集合中。 
- sinter<key1><key2> : 返回两个集合的交集元素。 
- sunion<key1><key2> : 返回两个集合的 并集元素。 
- sdiff<key1><key2> : 返回两个集合的 差集元素, 返回的是 key1 中的,不包含 key2 中的元素 
2.5.3 数据结构
- Set 集合的数据结构是 dict 字典,字典是用哈希表实现的。 
- Java 中 HashSet 的内部实现使用的是 HashMap,只不过所有的 value 都指向同一个对象。 
- Redis 的 set 结构也是一样的,它们的内部也使用 hash 结构,所有的 value 都指向同一个内布置。 
2.6 Redis—— Hash 类型的数据
2.6.1 简介
- Redis 中的 hash 是一个键值对集合。 
- Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。 
- 类似 Java 里面的 Map<String,Object> 
- Hash 类型最适合用于存储对象。 
举个列子:
用户 ID 为查找的 key,存储的 value 用户对象包含姓名、年龄、生日等信息,如果用普通的 key/value 结构来存储。
 
 Hash 主要存在以下三种方式:
第一种:JSON 对象
注意:这种是以 JSON 字符串的方式存储,在修改的时候需要获取全部的值然后进行修改。
第二种:对象
注意:这种存储形式虽然说修改属性值的时候方便,但是会造成大量的数据存储。
第三种:Hash
 
 通过 key(用户 ID) + field(属性标签)就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制问题。
2.6.2 常用命令
- hset<key><field><value> : 给<key>集合中的 <field>键赋值<value>。 
 
 - hget<key1><field> : 从<key1>集合中取出<field>对应的值。 
 
 - hmset <key><field1><value1><field2><value2> : 批量设置 hash 的值。 
- hexists<key><field> : 查看哈希表 key 中,给定的 field 是否存在。 
- hkeys <key> : 列出该 hash 集合的所有 field。 
 
 - hvals<key> : 列出该 hash 集合中所有的 value。 
- hincrby<key><field><increment> : 为哈希表 key 中的阈 field 的值加上增量 increment。只能给 Integer 类型的数据添加,就是做的简单的加减法运算。 
- hsetnx <key><field><value> : 将哈希表 key 中的阈 field 的值设置为 value,当且仅当阈 field 不存在的时候才会设置,存在的话直接忽略。 
2.6.3 数据结构
- Hash 类型对应的数据结构是两种: ziplist(压缩列表),hashtable(哈希表) 。当 field-value 长度较短且个数较少时,使用 ziplist,否则使用 hashtable。 
2.7 Redis—— zset 类型的数据
2.7.1 简介
- zset 是一个有序的、没有重复元素的字符串集合。 
- 在 zset 中每个成员都关联了一个 评分(score) ,这个评分被用来按照从最低分到最高分的方式排序集合中的成员。 集合中饿成员是唯一的,但是评分是可以重复的。 
- 因为元素是有序的,所以你可以很快的根据评分或者次序来获取一个范围的元素。 
- 访问有序集合中的元素也是非常快的,因此你能够使用有序集合做一个没有重复成员的智能列表。 
2.7.2 常用命令
- zadd <key><score1><value1><score2><value2> : 将一个或者多个 member 元素及其 score 值加入到有序集合 key 中。 
 
 - zrange <key><start><stop> [WITHSCORES] : 返回有序集合中,下标在 <start> 与 <stop> 之间的元素。 
- 带有 WITHSCORES ,可以让分数和值返回到结果集中。 
- 其中包含 <start> 与 <stop> ,是一个闭区间,并且下标是从 0 开始的。 
- 如果想把 score 和 value 一起显示,添加 WITHSCORES 参数。 
- zrange key 0 -1(查询全部的成员),并且根据 score 升序排序。 
 
 - zrangebyscore <key> minmax [WITHSCORES] : 返回集合 key 中,所有 score 值介于 min 和 max 之间(包含 min 、max) 的成员,从小到大排序。 
 
  
 - zrevrangebyscore <key> maxmin [WITHSCORES] : 同上 ,改为从大到校排序。 
 
  
 - zincyby <key> <increment><value> : 为元素的 score 加上增量。 
 
 - zrem <key><value> : 删除该集合下,指定值的元素。 
 
 - zcount <key><min><max> : 统计该集合,分数区间内的元素个数。 
 
 - zrank <key><value> : 返回该值在集合中排名,从 0 开始。 
 
 案列:使用 zset 实现一个文章访问量的排序?
 
 2.7.3 数据结构
- SortedSet(zset) : Redis 提供的一个非常特别的数据结构,一方面它等价于 Java 的数据结构 Map<String,Double> ,可以给每一个元素 value 赋予一个权重 score,另一方面它又类似于 TreeSet,内部的元素会按照权重 score 进行排序,可以得到每个元素的名次,还可以通过 score 的范围来获取元素的列表。 
zset 底层使用了两个数据结构:
- hash : hash 的作用就是关联元素 value 和权重 score ,保障元素 value 的唯一性,可以通过元素 value 找到相应的 score 值。 
- 跳跃表:跳跃表的目的在于给元素 value 排序,根据 score 的范围获取元素列表。 











 
    
评论