Redis数据类型
官方命令大全网址:www.redis.cn/commands.ht…
Redis 中存储数据是通过 key-value 格式存储数据的,其中 value 可以定义五种数据类型
- string(字符类型)
- Hash(散列类型)
- List(列表类型)
- Set(集合类型)
- SortedSet(有序集合类型,简称zset)
注意:在 redis 中的命令语句中,命令是忽略大小写的,而 key 是不忽略大小写的
string 类型
命令
赋值
-
语法
SET key value -
示例
127.0.0.1:6379> set test 123 -
图例
取值
-
语法
GET key -
示例
127.0.0.1:6379> get test -
图例
取值并赋值
-
语法
GETSET key value -
示例
getset test 222 -
图例
数值增减
注意事项
- 当value为整数数据时,才能使用以下命令操作数值的增减
- 数值递增都是【原子】操作
- redis中的每一个单独的命令都是原子性操作。当多个命令一起执行的时候,就不能保证原子性,不过我们可以使 用事务和lua脚本来保证这一点
非原子性操作示例
int i = 1;
i++;
System.out.println(i);
递增数字
-
语法
INCR key -
示例
incr num -
图例
增加指定的整数
-
语法
INCRBY key increment -
示例
incrby num 2 -
图例
递减数值
-
语法
DECR key -
示例
DECR num -
图例
减少指定的整数
-
语法
DECRBY key decrement -
示例
DECRBY num 2 -
图例
仅当不存在时赋值
使用该命令可以实现【分布式锁】的功能
-
语法
setnx key value -
示例
SETNX job "programmer" -
图例
其它命令
向尾部追加值
APPEND 命令,向键值的末尾追加 value
如果键不存在则将该键的值设置为 value ,即相当于 SET key value 。返回值是追加后字符串的总长度
-
语法
APPEND key value -
示例
append str " world!" -
图例
获取字符串长度
STRLEN 命令,返回键值的长度,如果键不存在则返回0
-
语法
STRLEN key -
示例
strlen str -
图例
同时设置/获取多个键值
STRLEN 命令,返回键值的长度,如果键不存在则返回0
-
语法
MSET key value [key value …]MGET key [key …] -
示例
mset k1 v1 k2 v2 k3 v3mget k1 k3 -
图例
hash类型
hash 类型也叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等 其它类型
命令
赋值
HSET 命令不区分插入和更新操作,当执行插入操作时 HSET 命令返回 1 ,当执行更新操作时返回 0
设置一个字段值
-
语法
HSET key field value -
示例
hset user username zhangsan -
图例
设置多个字段值
-
语法
HMSET key field value [field value ...] -
示例
hmset user age 20 username lisi -
图例
当字段不存在时赋值
类似 HSET ,区别在于如果字段存在,该命令不执行任何操作
-
语法
HSETNX key field value -
示例
hsetnx user age 30 -
图例
如果user中没有age字段则设置age值为30,否则不做任何操作
取值
获取一个字段值
-
语法
HGET key field -
示例
hget user username -
图例
获取多个字段值
-
语法
HMGET key field [field ...] -
示例
hmget user age username -
图例
获取所有字段值
-
语法
HGETALL key -
示例
hgetall user -
图例
删除字段
可以删除一个或多个字段,返回值是被删除的字段个数
-
语法
HDEL key field [field ...] -
示例
hdel user age -
图例
增加数字
-
语法
HINCRBY key field increment -
示例
hincrby user age 4 -
图例
其它命令
判断字段是否存在
-
语法
HEXISTS key field -
示例
hexists user agehexists user name -
图例
只获取字段名或字段值
-
语法
HKEYS keyHVALS key -
示例
hkeys userhvals user -
图例
获取字段数量
-
语法
HLEN key -
示例
hlen user -
图例
string类型和hash类型的区别
hash类型适合存储那些对象数据,特别是对象属性经常发生【增删改】操作的数据。 string类型也可以存储对象数据,将java对象转成json字符串进行存储,这种存储适合【查询】操作
list类型
ArrayList与LinkedList的区别
-
ArrayList 使用数组方式存储数据,所以根据索引查询数据速度快,而新增或者删除元素时需要设计到位移操作,所以比较慢
-
LinkedList 使用双向链表方式存储数据,每个元素都记录前后元素的指针,所以插入、删除数据时只是更改前后元素的指针指向即可,速度非常快。然后通过下标查询元素时需要从头开始索引,所以比较慢,但是如果查询前几个元素或后几个元素速度比较快
List类型介绍
-
Redis 的列表类型( list 类型)可以 存储一个有序的字符串列表 ,常用的操作是向列表两端添加元素,或者获得列表的某一个片段
-
列表类型内部是使用双向链表( double linked list )实现的,所以向列表两端添加元素的时间复杂度为O(1) ,获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的
命令
赋值
一个或多个值插入到列表头部
如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误
-
语法
LPUSH key value [value ...] -
示例
lpush list1 1 2 3 4 -
图例
一个或多个值插入到列表的尾部(最右边)
如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误
-
语法
RPUSH key value [value ...] -
示例
rpush list1 5 6 7 8 -
图例
从列表两端弹出元素
从列表左边弹出一个元素,会分两步完成:
第一步是将列表左边的元素从列表中移除
第二步是返回被移除的元素值
同理右边就是从右边移除,返回移除的值
-
语法
LPOP keyRPOP key -
示例
lpop list1rpop list1 -
图例
取值
获取列表中的某一片段
将返回start、stop之间的所有元素(包含两端的元素),索引从0开始。索引可以 是负数,如:“-1”代表最后边的一个元素
-
语法
LRANGE key start stop -
示例
lrange list1 0 2 -
图例
获取列表中元素的个数
-
语法
LLEN key -
示例
llen list1 -
图例
其它命令
删除列表中指定个数的值
LREM 命令会删除列表中前 count 个值为 value 的元素,返回实际删除的元素个数。根据 count 值的不同,该命令的执行方式会有所不同
当count>0时, LREM会从列表左边开始删除
当count<0时, LREM会从列表后边开始删除
当count=0时, LREM删除所有值为value的元素
-
语法
LREM key count value -
示例
lrem list2 1 3lrem list2 -1 6lrem list2 0 1 -
图例
获得指定索引的元素值
-
语法
LINDEX key index -
示例
lindex list2 1 -
图例
获得指定索引的元素值
当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误
-
语法
LSET key index value -
示例
lindex list2 1 88 -
图例
只保留列表指定片段
让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除,指定范围和LRANGE一致
-
语法
LTRIM key start stop -
示例
ltrim list2 1 2 -
图例
向列表中插入元素
该命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面
-
语法
LINSERT key BEFORE|AFTER pivot value -
示例
linsert list2 before 88 66linsert list2 after 88 77 -
图例
将元素从一个列表转移到另一个列表中
用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回
-
语法
RPOPLPUSH source destination -
示例
rpoplpush list2 list3 -
图例
set类型
set类型介绍
set 类型即集合类型,其中的数据是不重复且没有顺序
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型的 Redis 内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为 0(1)
Redis 还提供了多个集合之间的交集、并集、差集的运算
命令
赋值
添加元素/删除元素
-
语法
SADD key member [member ...]SREM key member [member ...] -
示例
sadd set1 a b csrem set1 a -
图例
取值
获得集合中的所有元素
-
语法
SMEMBERS key -
示例
smembers set1 -
图例
判断元素是否在集合中
-
语法
SISMEMBER key member -
示例
sismember set1 asismember set1 d -
图例
集合运算命令
集合的差集运算
A-B:属于A并且不属于B的元素构成的集合
-
语法
SDIFF key [key ...] -
示例
sdiff setA setB -
图例
集合的交集运算
A ∩ B:属于A且属于B的元素构成的集合
-
语法
SINTER key [key ...] -
示例
sinter setA setB -
图例
集合的并集运算
A ∪ B:属于A或者属于B的元素构成的集合
-
语法
SUNION key [key ...] -
示例
sunion setA setB -
图例
其它命令
获得集合中元素的个数
-
语法
SCARD key -
示例
scard set1 -
图例
从集合中弹出一个元素
由于集合是无序的,所有SPOP命令会从集合中随机选择一个元素弹出
-
语法
SPOP key [count] -
示例
spop set1spop set1 2 -
图例
zset类型 (sortedset)
zset介绍
在 set 集合类型的基础上,有序集合类型为集合中的每个元素都 关联一个分数 ,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作
与列表类型的相似与区别
-
相似
-
二者都是有序的
-
二者都可以获得某一范围的元素
-
-
区别
-
列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢
-
有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快
-
列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现)
-
有序集合要比列表类型更耗内存
-
命令
赋值
增加元素
向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素
-
语法
ZADD key score member [score member ...] -
示例
zadd zset1 80 zhangsan 89 lisi 94 wangwuzadd zset1 97 zhangsan -
图例
删除元素
移除有序集合key中的一个或多个成员,不存在的成员将被忽略
当key存在但不是有序集类型时,返回一个错误
-
语法
ZREM key member [member ...] -
示例
zrem zset1 wangwu -
图例
取值
获得排名在某个范围的元素列表
ZRANGE:按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
ZREVRANGE:按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
如果需要获得元素的分数的可以在命令尾部加上 WITHSCORES 参数
-
语法
ZRANGE key start stop [WITHSCORES]ZREVRANGE key start stop [WITHSCORES] -
示例
zrange zset1 0 2zrevrange zset1 0 2 -
图例
获取元素的分数
-
语法
ZSCORE key member -
示例
zscore zset1 zhangsan -
图例
其它命令
获得指定分数范围的元素
-
语法
ZRANGEBYSCORE key min max [WITHSCORES] -
示例
zrangebyscore zset1 80 90 -
图例
增加某个元素的分数
返回值是更改后的分数
-
语法
ZINCRBY key increment member -
示例
zincrby zset1 92 zhangsan -
图例
获得集合中元素的数量
-
语法
ZCARD key -
示例
zcard zset1 -
图例
获得指定分数范围内的元素个数
-
语法
ZCOUNT key min max -
示例
zcount zset1 80 100 -
图例
按照排名范围删除元素
-
语法
ZREMRANGEBYRANK key start stop -
示例
zremrangebyrank zset1 0 1 -
图例
按照分数范围删除元素
-
语法
ZREMRANGEBYSCORE key start stop -
示例
zremrangebyscore zset1 0 200 -
图例
获取元素的排名
ZRANK:从小到大
ZREVRANK:从大到小
-
语法
ZRANK key memberZREVRANK key member -
示例
zrank zset1 azrevrank zset1 a -
图例
通用命令
keys
返回满足给定pattern 的所有key
- 语法
`keys pattern`
-
示例
keys zset* -
图例
del
删除
- 语法
`del key`
-
示例
del test -
图例
exists
确认一个key 是否存在
-
语法
exists key -
示例
exists test -
图例
expire(重要)
Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁
EXPIRE key seconds 设置key的生存时间(单位:秒)key在多少秒后会自动删除
TTL key 查看key生于的生存时间
PERSIST key 清除生存时间
PEXPIRE key milliseconds 生存时间设置单位为:毫秒
-
语法
EXPIRE key seconds -
示例
expire test 5 -
图例
rename
重命名key
-
语法
rename oldkey newkey -
示例
rename zset1 zset2 -
图例
type
显示指定key的数据类型
-
语法
type key -
示例
type zset2 -
图例