Redis-五种基本类型
Redis启动
首先修改redis.conf配置文件
配置完成后,保存退出,再次通过 redis-server redis.conf
命令启动 Redis,此时,就是在后台启
动了。
String
String 是 Redis 里边最最简单的一种数据结构。在 Redis 中,所以的 key 都是字符串,但是,不同的
key 对应的 value 则具备不同的数据结构,我们所说的五种不同的数据类型,主要是指 value 的数据类
型不同。
Redis 中的字符串是动态字符串,内部是可以修改的,像 Java 中的 StringBuffer,它采用分配冗余空间
的方式来减少内存的频繁分配。在 Redis 内部结构中,一般实际分配的内存会大于需要的内存,当字符
串小于 1M 的时候,扩容都是在现有的空间基础上加倍,扩容每次扩 1M 空间,最大 512M。
指令 | 功能 |
---|---|
key | 就是给一个 key 赋值的。 |
append | 使用 append 命令时,如果 key 已经存在,则直接在对应的 value 后追加值,否则就创建新的键值对。 |
decr | 可以实现对 value 的减 1 操作(前提是 value 是一个数字),如果 value 不是数字,会报错,如果value 不存在,则会给一个默认的值为 0,在默认值的基础上减一。 |
decrby | 和decr类似,但是可以设置步长,该命令的第二个参数就是步长 |
get | 用来获取一个key的value |
getrange | getrange可以用来返回key对应的value的子串,这有点类似于 Java 里边的 substring。这个命令第二个和第三个参数就是截取的起始和终止位置,其中,-1 表示最后一个字符串,-2 表示倒数第二个字符串,以此类推... |
getset | 获取并更新一个key |
incr | 给一个key的value自增 |
incrby | 给一个key自增,同时还可以设置步长 |
incrbyfloat | 和incrby类似,但是步长可以设置为浮点数 |
mget和mset | 批量获取和批量存储 |
ttl | 查看key的有效期 |
setex | 在个key设置value的同时,还设置过期时间 |
psetex | 和setex类似,单位是毫秒 |
setnx | set命令会覆盖已经存在的key,setnx不会 |
msetnx | 批量设置 |
setrange | 覆盖一个已经存在的key的长度 |
strlen | 查看字符串长度 |
BIT命令
在redis中,字符串都是以二进制的方式来存储的,例如set k1 a,a对应的ascii码是97,97转换为二进制是01100001,BIT相关的命令就是对二进制进行操作的
指令 | 功能 |
---|---|
getbit | key对应的value在offset处的bit值 |
setbit | 修改key对应的value在offset处的bit值 |
bitcount | 统计二进制数据中1的个数 |
List
列表这种对象支持存现一组有序的,不重复的数据,因为其有序性,它可以获取指定范围的元素列表,可以在O(1)的时间复杂度获取指定索引的下标的元素
在Redis3.2版本以前列表类型的内部编码有两种。当满足下面两个条件的时候,Redis 列表对象使用ziplist(压缩列表)来实现。
- 当列表的元素个数小于list-max-ziplist-entries配置(默认512个)
- 当列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节)
当列表类型无法满足ziplist条件时,Redis会使用linkedList作为列表的内部实现。而在Redis3.2版本开始对列表数据结构进行改造,使用quickList代替了zipList和linkedList。由于列表对象的有序且不可重复的特性,它比较适合用来做文章、商品等列表的存储。
列表类型可以lpush(左侧push),同时又可以使用rpop(右侧弹出)第一个元素,所以列表类型具有先进先出的特性,可以用来实现消息队列,也可以lpush(左侧push)和lpop(左侧弹出),具有后进先出的特性,因此开发中需要使用栈的时候,我们可以使用列表对象来实现。
先进先出:lpush(左侧push) rpop(右侧pop) 做消息队列
后进先出:lpush(左侧push) lpop(左侧弹出)做栈
关于List更详细的介绍,参考这篇博客
指令 | 功能 |
---|---|
lpush | 将所有指定的值插入到存于 key 的列表的头部。如果 key 不存在,那么在进行 push 操作前会创建一个空列表。 如果 key 对应的值不是一个 list 的话,那么会返回一个错误。 |
lrange | 返回列表指定区间内的元素。 |
rpush | 向存于 key 的列表的尾部插入所有指定的值。 |
rpop | 移除并返回列表的尾元素。 |
lpop | 移除并返回列表的头元素。 |
lindex | 返回列表中,下标为 index 的元素。 |
ltrim | 可以对一个列表进行修剪。 |
blpop | 阻塞式的弹出,相当于 lpop 的阻塞版。 |
Set
集合对象是一个无序且唯一的键值集合。它的存储顺序不会按照插入的先后顺序进行存储,与列表不同的是,它存储的数据是无序且不重复的
集合对象的内部编码也有两种,intest(整数集合)与hashtable(哈希表),当满足下面两个条件的时候,集合对象使用intset来实现
- 集合中的元素都是整数
- 集合中元素的个数小于 set-maxintset-entries配置(默认512个)
不满足上面两个条件时,集合对象使用hashtable来实现
集合对象的主要两个特性就是:无序,不可重复,支持并交差,因此可以用来做标签系统
而集合中的 SPOP(随机移除并返回集合中一个或多个元素) 和 SRANDMEMBER(随机返回集合中一个或多个元素)命令可以帮助我们实现一个抽奖系统
spop
srandmember
有关Set更详细的介绍,参考这篇博客
指令 | 功能 |
---|---|
sadd | 添加一个元素到一个key中 |
smembers | 获取一个 key 下的所有元素 |
srem | 移除指定的元素 |
sismemeber | 返回某一个成员是否在集合中 |
scard | 返回集合的数量 |
srandmember | 随机返回一个元素 |
spop | 随机返回并且出栈一个元素。 |
smove | 把一个元素从一个集合移到另一个集合中去。 |
sdiff | 返回两个集合的差集。 |
sinter | 返回两个集合的交集。 |
sdiffstore | 这个类似于 sdiff ,不同的是,计算出来的结果会保存在一个新的集合中。 |
sinterstore | 类似于 sinter,只是将计算出来的交集保存到一个新的集合中。 |
sunion | 求并集。 |
sunionstore | 求并集并且将结果保存到新的集合中。 |
Hash
hash结构中,key是一个字符串 ,value则是一个key/value键值对
哈希对象用来存储一组数据对。每个数据对又包含键值两部分
Hash对象也有两种实现方式:ziplist(压缩列表)和 hashtable(哈希表)
同样,只有当存储的数据量比较小的情况下,Redis才使用压缩列表来实现哈希对象,具体需要满足两个条件
- 字典中保存的键和值的大小都要小于64字节
- 字典中键值对的个数要小于512个
当不能同时满足上面的两个条件时,Redis就使用哈希表来实现Hash对象
当存储的内容是对象的时候,Redis字符串对象很多功能使用Redis 哈希对象也可以实现,如缓存用户信息的时候,使用Redis哈希对象存储,简单直观,如果使用合理可以减少内存空间的使用。
但是也有其缺点,就是要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable将会消耗更多的内存。
此外,Hash对象还可以实现购物车和计数器等功能,更详细的介绍,参考这篇博客
指令 | 功能 |
---|---|
hset | 添加值 |
hget | 获取值 |
hmset | 批量设置 |
hmget | 批量获取 |
hdel | 删除一个指定的 field |
hsetnx | 默认情况下,如果 key 和 field 相同,会覆盖掉已有的 value,hsetnx 则不会。 |
hvals | 获取所有的 value |
hkeys | 获取所有的 key |
hgetall | 同时获取所有的 key 和 value |
hexists | 返回 field 是否存在 |
hincrby | 给指定的 value 自增 |
hincrbyfloat | 可以自增一个浮点数 |
hlen | 返回 某一个 key 中 value 的数量 |
hstrlen | 返回某一个 key 中的某一个 field 的字符串长度 |
ZSet
有序集合类型 (Sorted Set或ZSet) 相比于集合类型多了一个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序结合的元素值,一个是排序值。有序集合保留了集合不能有重复成员的特性(分值可以重复),但不同的是,有序集合中的元素可以排序
有序集合是由 ziplist (压缩列表) 或 skiplist (跳跃表) 组成的。
当数据比较少时,有序集合使用的是 ziplist 存储的,有序集合使用 ziplist 格式存储必须满足以下两个条件:
- 有序集合保存的元素个数要小于 128 个;
- 有序集合保存的所有元素成员的长度都必须小于 64 字节。
如果不能满足以上两个条件中的任意一个,有序集合将会使用 skiplist 结构进行存储。
有序集合比较典型的使用场景就是排行榜系统例如学生成绩的排名。某视频(博客等)网站的用户点赞、播放排名、电商系统中商品的销量排名等。
有关Redis有序集合对象的更详细的介绍,参考这篇博客
指令 | 功能 |
---|---|
zadd | 将指定的元素添加到有序集合中 |
zscore | 返回 member 的 score 值 |
zrange | 返回集合中的一组元素 |
zrevrange | 返回一组元素,但是是倒序 |
zcard | 返回元素个数 |
zcount | 返回 score 在某一个区间内的元素 |
zrangebyscore | 按照 score 的范围返回元素 |
zrank | 返回元素的排名(从小到大 |
zrevrank | 返回元素排名(从大到小 |
zincrby | score 自增 |
zinterstore | 给两个集合求交集 |
zrem | 弹出一个元素 |
zlexcount | 计算有序集合中成员数量 |
zrangebylex | 返回指定区间内的成员 |
key
指令 | 功能 |
---|---|
del | 删除一个 key/value |
dump | 序列化给定的 key |
exists | 判断一个 key 是否存在 |
ttl | 查看一个 key 的有效期 |
expire | 给一个 key 设置有效期,如果 key 在过期之前被重新 set 了,则过期时间会失效。 |
persist | 移除一个 key 的过期时间 |
keys * | 查看所有的 key |
pttl | 和 ttl 一样,只不过这里返回的是毫秒 |