大家好,我系渣渣骥,今天跟大家分享的主题是:Redis有哪些常用的数据结构?
一般的回答是有字符串、列表、集合、有序集合和HASH,此外还有Bimap, HyperLogLog等。
本节内容希望读者能够多打开文稿查看,里面有很多更为详细的命令的使用方法。
1. 字符串:
我们可以通过set key value设置一个字符串
如:
set username wolong
这样就把username设置为了wolong。如果key已经持有其他值,set命令就覆写旧值,无视其类型。并且默认的过期时间是永久,即永远不会过期。
这时,我们可以使用
del key 命令将其删除
如:
del username
或者设置过期时间:
expire key timeout(单位为秒)
也可以在设置值的时候,一同指定过期时间:
set key value EX timeout
或:
setex key timeout value
查看过期时间:
ttl key
如:
ttl username
查看当前redis中的所有key:
keys *
2. list列表:
Redis可以往列表两端添加元素,使用不同的命令。
在列表左边添加元素:
lpush key value
将值value插入到列表key的表头。如果key不存在,一个空列表会被创建并执行lpush操作。当key存在但不是列表类型时,将返回一个错误。
在列表右边添加元素:
rpush keyvalue
将值value插入到列表key的表尾。如果key不存在,一个空列表会被创建并执行RPUSH操作。当key存在但不是列表类型时,返回一个错误。
查看列表中的元素:
lrange key start stop
返回列表key中指定区间内的元素,区间以偏移量start和stop指定,如果要左边的第一个到最后的一个lrange key 0 -1。
移除列表中的元素:
移除并返回列表key的头元素:
lpop key
移除并返回列表的尾元素:
rpop key
移除并返回列表key的中间元素:
lrem key count value
将删除key这个列表中,count个值为value的元素。
指定返回第几个元素:
lindex key index
将返回key这个列表中,索引为index的这个元素。
获取列表中的元素个数:
llen key
如:
llen languages
删除指定的元素:
lrem keycount value
如:
lrem languages 0 php
根据参数 count 的值,移除列表中与参数 value 相等的元素。count的值可以是以下几种:
count> 0:从表头开始向表尾搜索,移除与value相等的元素,数量为count。
count< 0:从表尾开始向表头搜索,移除与 value相等的元素,数量为count的绝对值。
count = 0:移除表中所有与value 相等的值。
3. set集合:
set与list的却区别在于,list中可以有重复元素,但是set中不会有重复的元素。
添加元素:
sadd set value1 value2....
如:
sadd team xiaotuo datuo
查看元素:
smembeers set
如:
smembers team
移除元素:
srem set member...
如:
srem team xiaotuo datuo
查看集合中的元素个数:
scard set
如:
scard team1
集合也十分方便求交集、并集和差集。
获取多个集合的交集:
sinter set1 set2
如:
sinter team1 team2
获取多个集合的并集:
sunion set1 set2
如:
sunion team1 team2
获取多个集合的差集:
sdiffset1 set2
如:
sdiffteam1 team2
4. hash:
添加一个新值:
hset key field value
如:
hset website baidu baidu.com
将哈希表key中的域field的值设为value。
如果key不存在,一个新的哈希表被创建并进行 HSET操作。如果域 field已经存在于哈希表中,旧值将被覆盖。
获取哈希中的field对应的值:
hget key field
如:
hget websitebaidu
删除field中的某个field:
hdel keyfield
如:
hdel website baidu
获取某个哈希中所有的field和value:
hgetall key
如:
hgetall website
获取某个哈希中所有的field:
hkeys key
如:
hkeys website
获取某个哈希中所有的值:
hvals key
如:
hvalswebsite
判断哈希中是否存在某个field:
hexists key field
如:
hexistswebsite baidu
获取哈希中总共的键值对:
hlen field
如:
hlenwebsite
5. 有序集合
Redis的有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。Redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。
redis127.0.0.1:6379> ZADD mySortset 1 redis
(integer)1
redis127.0.0.1:6379> ZADD mySortset 2 mongodb
(integer)1
redis127.0.0.1:6379> ZADD mySortset 3 mysql
redis127.0.0.1:6379> ZRANGE mySortset 0 10 WITHSCORES
1)"redis"
2)"1"
3)"mongodb"
4)"2"
5)"mysql"
6)"3"
另外除了基本的数据结构以外,如果回答出Redis支持发布/订阅操作,会是一个加分项:
向某个频道发布消息使用命令:
publishchannel message
订阅某个频道的消息:
subscribe channel
另外,Redis还有Bitmap、 HyperLoglog等用于统计的数据结构,将在下一节中进行分享。
用户评论