Redis基本类型一共有五类:
- 字符串类型(string);
- 散列类型(hash);
- 列表类型(list);
- 集合类型(sort);
- 有序集合类型(zset);
在redis中,所有的类型都是被以键值对形式存放,类型只体现在键值对的值上。
如列表类型,数据格式如下。它的整体存放仍然是key-value的格式,只不过它的value里面是一个列表类型。
如散列类型,数据格式如下。它的整体存储也是遵照key-value的格式,但是它的value存放是散列类型。
其他的几种数据类型类似,都是将各自的特点体现在了value里面。且每一种数据类型不能存在互相包含的关系。如Java中可以如下方式定义集合,在List对象中保存Map对象,Map对象中又可以保存List对象。
List<Map<String, List<String>>> list;
而在Redis中,不能存在如上那样的数据类型互相包含的关系,如列表类型的列表中,只能存放字符串,如散列类型的键值对的键和值,也都只能存放字符串。
字符串类型
字符串类型是Redis里面最简单地一种数据类型。它的值部分只存放一个字符串。
常用命令:
set key value;添加或修改一个字符串类型。如果key存在,则是修改,如果不存在,则是添加。
get key;获取一个字符串类型的value。
mset key value [key1 value1...];添加或修改一个或多个字符串类型。
mget key [key1...];获取多个字符串类型的value,以列表形式返回。
strlen key;返回字符串长度,不存在返回0。
append key value;向指定字符串后面添加字符串,如果key不存在,该命令等同set。
setnx key value;如果key不存在,则添加,如果key已存在,则不做任何操作。
由于Redis中没有数字类型,因此如果我们要计算数字类型,可以在字符串类型中进行处理。
整数型
incr key;自增1,如果key不存在,会先自动创建并设置它的value为0,然后进行incr key操作。
decr key;自减1,如果不存在,处理如上。
incrby key incrememt;增加incrememt,值增加前和增加后都必须是整数。如果key不存在,处理如上。
decrby key decrememt;减去decrememt,值减去前和减去后都必须是整数。如果key不存在,处理如上。
浮点型
incrbyfloat key incrememt;增加incrememt。这里的值和incrememt可以是整数也可以是浮点数。如果key不存在,同样处理。
散列类型
散列类型是以散列表存放的数据,它的时间复杂度是0(1),如果发生hash碰撞,会以单向链表的形式进行处理。
也因此,可以将散列类型的内部重新当成是一个字符串类型的key-value,许多常用命令与字符串类型差异不大。
常用命令:
hset key field value;添加
hget key field;获取
hmset key field value [field1 value1...];批量添加
hmget key field [field...];批量获取
hsetnx key field value;如果key不存在,则添加,如果key已存在,则不做任何操作
hincrby key field increment;对字段field的值增加整数increment。要求field原本对应的值也必须是整数。
上面六个命令在字符串类型中有类似的命令,因为散列的数据格式也是key-value,和字符串类型的格式十分相似,因此处理方法也大多相似。
hgetall key;获取所有的字段与值
hexists key field;判断某个字段是否存在
hlen key;获取字段数量。
hkeys key;获取所有字段名
hvals key;获取所有的字段值
列表类型
列表类型是一个有序可重复的双向链表,它对两头的操作是非常快速的,但是越往中间速度越慢。
常用命令:
lpush key value [value1...];从左边添加一个或多个值
rpush key value [value1...];从右边添加一个或多个值
lpop key;从左边弹出一个值。
rpop key;从右边弹出一个值。
llen key;获取列表长度。和散列类型一样,都通过*len key返回value中的元素数量。
lrange key start stop;获取从下标start到stop所有的元素(包括了start和stop)。下标按从左到右的顺序,0作为第一个下标。如果是按照从右到左的顺序,则是-1作为第一个下标。
lrem key count value;删除|count|个等于指定value的元素。如果count大于0,从左边开始,如果count小于0,从右边开始。当count等于0时,会删除所有等于value的元素。
lindex key index;获取列表中指定位置的值,如果index大于等于0,从左边开始,第一个元素下标是0。如果index小于0,则从右边开始,第一个元素下标是-1。
lset key index value;更新下标为index的元素的value,index可以为正为负。
ltrim key start stop;只保留start到stop的元素,其余全部删除。
linsert key before|after value1 value2;从左到右,在第一次出现的value1值的前面或后面插入value2值,只会插入一个元素。
rpoplpush source destination;将source中最右的元素弹出并添加到destination的左边。可以对source和destination使用同一个列表,用作轮训功能。
集合类型
集合类型具有无序性和唯一性。它是采用散列形式实现,添加的元素作为散列的key,值都是空。
常用命令:
sadd key member [member...];添加一个或多个元素
srem key member [member...];删除一个或多个元素。不写member默认删除所有元素。
smembers key;返回集合中所有的元素。
sismember key member;判断元素是否在集合中
scard key;返回集合中元素的个数。
spop key;从集合中随机弹出一个元素,并删除。
srandmember key [count];从集合中随机获取|count|个元素。假如count不存在,获取1个元素。如果count为正数,获取count个不重复元素。如果count为负数,获取-count个可重复元素。
PS:在集合中的随机并不是每个元素的概率相等。由于它是使用散列加链表的形式存放数据,因此会先在有元素的hash值中进行一个随机,找到对应的hash位置,hash位置存放的是链表,再次对链表上的元素进行随机。有的链表元素多,里面元素的选中概率就低,有的链表元素少,里面元素的选中概率就高。因此集合中每一个元素的随机概率并不相等。
集合的计算:
sdff key1 [key2..];计算key1与一个或多个集合的差集。
sinter key1 [key2...];计算多个集合的交集。
sunion key1 [key2...];计算多个集合的并集。
sdiffstore|sinterstore|sunionstore destination key [key2...];计算多个集合的差集|交集|并集,并将结果存放在新集合destination中。
有序集合类型
有序集合类型是在集合类型的基础上,增加了一个数字类型的分数score用来对元素进行排序,元素是有序不可重复的,分数可以重复,可以是整数也可以是浮点数。
常用命令:
zadd key score member [score member...];添加一个或多个元素和它们的分数。
zrem key member [member...];删除一个或多个元素。不写member默认删除所有元素。
zremrangebyrank key start stop;删除从小到大排序的下标从start到stop的元素。
zremrangebyscore key min max;删除从小到大排序的分数在min到max的元素。
scard key;返回集合中有多少个元素
zrank key member;返回元素从小到大的排名。
zrevrank key member;返回元素从大到小的排名。
zscore key member;返回元素的分数。
zincrby key incrememt member;给元素加分
zcount key min max;返回分数范围在[min,max]里的元素个数。
排序:
zrange key start stop [withscore];返回按从小到大顺序排列的下标从start到stop的元素,如果添加了withscore,还会返回它们的分数。
zrevrange key start stop [withscore];返回按从大到小熟悉怒排序的下标从start到stop的元素,添加withscore会返回分数。
zrangebyscore key min max [withscore] [limit offset count];返回按从小到大顺序排列的分数从min到max的元素,添加withscore会返回分数,添加limit
会从第offset个元素开始,返回count个元素。
zrevrangebyscore key max min [withscore] [limit offset count];返回按从大到小顺序排列的分数从max到min的元素,其余与上条类似,这里要注意的是max参数在min参数之前。
有序集合运算:
zinterstore destination numberkey key [key...] [weight] [aggregate sum|min|max];取多个集合的交集保存在新集合destination中,不添加aggregate参数时,分数会默认进行sum,weight代表每个集合的分数权重,范围从0到1,默认是1,会在aggregate之前将分数乘以权重。
zunionstore destination numberkey key [key...] [weight] [aggregate sum|min|max];取并集,与上一条类型。