一、背景:
最近做项目用到了redis作为缓存,来保证查询的响应时间,避免给数据库巨大的查询压力,就了解了下redis的相关信息。
二、我眼中的redis:
redis是一个开源的支持网络、并可基于内存可持久化的Key-Value的数据库,它提供多种语言的API(这里我用的是go的redis客户端)。redis本质也是一种键值的数据库
,但他在保持键值数据库简单快捷特点的同时,又吸收了部分关系型数据库的优点。所以redis可以说是处于关系数据库和键值数据库之间的一种数据库。下面就介绍下redis都能存储哪些数据类型。
三、redis的几种常用数据类型:
(1)String
String是最常用的一种数据类型,一般的key-value存储都可采用String的数据类型来存储。(这里value不仅仅可以是String也可以是数字,INCRBY可以通过原子递增保持计数)
常用命令:get、set、incrby等。同时还提供获取字符串长度、获取字符串某一段内容等功能。
(2)Hash
Redis Hash是一种string类型的filed和value的映射表,hash特别适合存储对象,redis中每个hash可以存储2的32次方-1个键值对。
常用命令:
1.hset:设定指定的hash field (hset "hash1" "field" "test")
2.hmset:同时设定hash多个filed(hmset "hash1" "field1" "test1" "field2" "test2")
3.hget:获取指定的hash值的field(hget "hash1" "field1")
4.hgetall:获取所有的hash值数据(hgetall "hash1")
5.hmget:获取hash值的多个field(hmget "hash1" "field1" "field2")
(3) List列表
列表类型可以存储一个有序的字符串列表,常用的操作是向列表的两端添加元素或获得列表的某个片段;列表类型内部是用使用双向链表实现的,故向列表的两端插入元素时间复杂度都是O(1),获取越接近两端的元素,速度越快。
常用命令:
1.lpush:从左边(即列表的头)向list列表中插入数据(lpush "list1" "test1")
2.rpush: 从右边(即列表的尾)向list列表中插入数据(rpush "list" "test1")
3.lpop:从列表左侧(即列表的头)弹出数据(lpop "list1")
4.rpop:从列表右侧(即列表的尾)弹出数据(rpop "list1")
(4)Set集合
集合中的元素都是不同的,且没有顺序。一个集合类型一个键可以存储2的32次方-1个字符串。集合类型的常用操作是向集合中加入或者删除元素、判断某个元素是否存在等,由于集合类型在redis内部是使用值为空的散列表实现,所以这些操作的时间复杂度是O(1)。值得一提的是多个集合类型的键值之间可以进行并集、交集、差集的运算。
常用命令:
(1)sadd:用来向集合中添加一个或者多个元素,如果键不存在则会自动创建。集合中不会有相同的元素,故若加入的元素已经存在则会忽略这个元素(sadd "set1" "test1" "test2")
(2)smembers:返回集合中的所有元素(smembers "set1")
(3)sdiff:计算差集(sdiff "set1" "set2")
(4)sinter:计算交集(sinter "set1" "set2")
(5)sunion:计算并集(sunion "set1" "set2")
(5)zset(Sorted set:有序集合)
在集合类型的基础上有序集合类型为集合中的元素关联了一个分数可以理解为权重,我们不仅可以完成插入,删除和盘算元素是否存在等集合类型支持的操作,还能活着分数最高(或最低)的前N个元素,获得指定分数范围内的元素等于分数相关的操作。集合中的元素不同,但是分数可以相同。
常用命令:
(1)zadd:向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原来的分数。zadd返回值为新加入到集合中的元素个数(zadd scoreboard 89 test1 67 test2 80 test3)
(2)zscore key member:获取元素的分数(zscore scoreboard test)
(3)zrange key start stop:按照元素分数从小到大顺序返回索引从start到stop之间的所有元素(zrange scoreboard 0 -1)
新闻热点
疑难解答