Redis 5种数据类型使用场景
#1.String
1.1 应用场景
String是最常用的一种数据类型,例如:key/value存储,value可以是String、数字等。
1.2 常用操作
1>set赋值,用法:set key value
2>get赋值,用法:get key
3>incr递增数字,仅仅对key的value为数字类型时使用,相当于java的自增,如i++,用法:incr key
#设置key:add的值为6,incr实行该key的value自增
redis 127.0.0.1:6379> set add 6
OK
redis 127.0.0.1:6379> incr add
(integer) 7
redis 127.0.0.1:6379> incr add
(integer) 8
redis 127.0.0.1:6379>
#如果key的value为String类型,出现如下现象
redis 127.0.0.1:6379> set addString 'lxl'
OK
redis 127.0.0.1:6379> incr addString
(error) ERR value is not an integer or out of range
redis 127.0.0.1:6379>
#很明显报错了,报错信息:vlaue不是一个integer类型
4>incrby 增加指定的数字,仅仅对数字类型的key有用,相当于java的i+=3,用法:incrby key increment,表示key自增increment,increment的值可以为负数,表示减少。
redis 127.0.0.1:6379> set add 15
OK
redis 127.0.0.1:6379> incrby add 3
(integer) 18
redis 127.0.0.1:6379> incrby add -5
(integer) 13
redis 127.0.0.1:6379>
5>decr递减数字,同incr递增原理一样
6>decrby减少指定数字,同incrby原理一样
7>append 向尾部追加值,相当于java中的"hello".append("boy"),用法:append key value
redis 127.0.0.1:6379> set ceshi hello
OK
redis 127.0.0.1:6379> append ceshi world
(integer) 10
redis 127.0.0.1:6379> get ceshi
"helloworld"
redis 127.0.0.1:6379>
8> strlen 获取字符串长度,用法:strlen key
redis 127.0.0.1:6379> get ceshi
"helloworld"
redis 127.0.0.1:6379> strlen ceshi
(integer) 10
redis 127.0.0.1:6379>
9>mset 同时设置多个key的值,用法mset key1 value1 [key2 value2 ……]
redis 127.0.0.1:6379> mset name lxl sex 男 age 29
OK
redis 127.0.0.1:6379> get name
"lxl"
redis 127.0.0.1:6379> get sex
"?
redis 127.0.0.1:6379> get age
"29"
redis 127.0.0.1:6379>
10>mget 同时获取多个key的值,用法:mget key1 key2 ……
redis 127.0.0.1:6379> mset name lxl sex 男 age 29
OK
redis 127.0.0.1:6379> get name
"lxl"
redis 127.0.0.1:6379> get sex
"?
redis 127.0.0.1:6379> get age
"29"
redis 127.0.0.1:6379> mget name sex age
1) "lxl"
2) "?
3) "29"
redis 127.0.0.1:6379>
#2.散列
它相当于java中的hashMap,它的值是一个字典,保存很多key/value对。
2.1应用场景:例如,我们需要存储一个用户的信息,该用户包含如下信息:name、sex、age等。
redis的hash提供的存储方案:每个用户都设置一个id,作为key,用户的所有属性用一个hashMp存放,hashMap里面的
每个属性作为key,value为属性值。
2.2常用命令
1>hset赋值,用法:hset key field(字段) value(值)
redis 127.0.0.1:6379> hset userId name 'lxl'
(integer) 0
redis 127.0.0.1:6379>
2>hget取值,用法:hget key field
redis 127.0.0.1:6379> hget userId name
"lxl"
redis 127.0.0.1:6379>
3>hmset 一次性赋值多个字段,用法hmset key field1 value1 [field2 value2 ……]
redis 127.0.0.1:6379> hmset userId name 'lxl' sex 0 age '29' address 成都
OK
redis 127.0.0.1:6379>
4>hmget 一次性取多个字段值,用法hmget key filed1 [field2 ……]
redis 127.0.0.1:6379> hmset userId name 'lxl' sex 0 age '29' address 成都
OK
redis 127.0.0.1:6379> hmget userId name age
1) "lxl"
2) "29"
redis 127.0.0.1:6379>
5>hgetall 一次性取所有字段的值,用法hgetall key
redis 127.0.0.1:6379> hmset userId name 'lxl' sex 0 age '29' address 成都
OK
redis 127.0.0.1:6379> hmget userId name age
1) "lxl"
2) "29"
redis 127.0.0.1:6379> hgetall userId
1) "name"
2) "lxl"
3) "sex"
4) "0"
5) "age"
6) "29"
7) "address"
8) "砛xc9都"
redis 127.0.0.1:6379>
6>hexists 判断字段是否存在,1:存在,0:不存在,实际上可以增加字段,用法:hexists key filed
#很明显看得出来,userId对应的hashMap中存在sex这个字段
redis 127.0.0.1:6379> hexists userId sex
(integer) 1
redis 127.0.0.1:6379>
7>hdel 删除一个或多个字段,用法:hdel key field [field2……]
#删除前字段有5个
redis 127.0.0.1:6379> hgetall userId
1) "name"
2) "lxl"
3) "sex"
4) "0"
5) "age"
6) "29"
7) "address"
8) "砛xc9都"
9) "job"
10) "IT"
#删除age这个字段
redis 127.0.0.1:6379> hdel userId age
(integer) 1
redis 127.0.0.1:6379> hgetall userId
1) "name"
2) "lxl"
3) "sex"
4) "0"
5) "address"
6) "砛xc9都"
7) "job"
8) "IT"
redis 127.0.0.1:6379>
8>hkeys 获取hash中所有的字段名,用法hkeys key
redis 127.0.0.1:6379> hkeys userId
1) "name"
2) "sex"
3) "address"
4) "job"
redis 127.0.0.1:6379>
9>hvals 获取所有的字段值,用法:hvals key
redis 127.0.0.1:6379> hvals userId
1) "lxl"
2) "0"
3) "砛xc9都"
4) "IT"
redis 127.0.0.1:6379>
10>hlen 获取字段数量,用法:hlen key
redis 127.0.0.1:6379> hvals userId
1) "lxl"
2) "0"
3) "砛xc9都"
4) "IT"
redis 127.0.0.1:6379> hlen userId
(integer) 4
redis 127.0.0.1:6379>
#3.列表
redis的列表其实就是一个双向链表,它可以实现遍历、正向(反向)添加(删除)数据。
2.1应用场景:可以实现消息排列等。
2.2常用命令
1>lpush 向列表左端添加元素,用法:lpush key value
redis 127.0.0.1:6379> lpush testList ZhangSan
(integer) 1
redis 127.0.0.1:6379> lpush testList LiSi
(integer) 2
redis 127.0.0.1:6379>
2>rpush 向列表右端添加元素,用法:rpush key value
redis 127.0.0.1:6379> rpush testList WangWu
(integer) 3
redis 127.0.0.1:6379> rpush testList ZhaoLiu
(integer) 4
redis 127.0.0.1:6379>
3>lrange 获取列表中某一个片段的值,用法:lrange key start stop,index从0开始,-1表示最后一个元素。
redis 127.0.0.1:6379> lpush testList ZhangSan
(integer) 1
redis 127.0.0.1:6379> lpush testList LiSi
(integer) 2
redis 127.0.0.1:6379> rpush testList WangWu
(integer) 3
redis 127.0.0.1:6379> rpush testList ZhaoLiu
(integer) 4
redis 127.0.0.1:6379> lrange testList 0 -1
1) "LiSi"
2) "ZhangSan"
3) "WangWu"
4) "ZhaoLiu"
redis 127.0.0.1:6379>
#从返回的结果中可以发现
#1.从左到右添加元素ZhangSan、LiSi,所以出现1)是ZhangSan、2)是LiSi的情况;
#2.从又到左添加元素WangWu、ZhaoLiu,所以出现3)和4)的情况
4>lpop,从列表左端弹出元素,用法:lpop key
redis 127.0.0.1:6379> lrange testList 0 -1
1) "LiSi"
2) "ZhangSan"
3) "WangWu"
4) "ZhaoLiu"
redis 127.0.0.1:6379> lpop testList
"LiSi"
redis 127.0.0.1:6379>
5>rpop,从列表右端弹出元素,用法:rpop key
redis 127.0.0.1:6379> lrange testList 0 -1
1) "ZhangSan"
2) "WangWu"
3) "ZhaoLiu"
redis 127.0.0.1:6379> rpop testList
"ZhaoLiu"
redis 127.0.0.1:6379>
6>llen,获取列表中元素的个数,用法llen key
redis 127.0.0.1:6379> lrange testList 0 -1
1) "ZhangSan"
2) "WangWu"
redis 127.0.0.1:6379> llen testList
(integer) 2
redis 127.0.0.1:6379>
7>lrem,删除列表中指定的值,返回值为成功删除指定值的个数,用法:lrem key count value,删除列表中count个value,当count>0时,从左边开始查找;count<0时,从右边开始查;count=0时,删除所有值为value的元素。
#从右到左,删除值为ZhangSan,个数为2
redis 127.0.0.1:6379> lrange testList 0 -1
1) "jj"
2) "ZhangSan"
3) "hh"
4) "ff"
5) "ZhangSan"
6) "ee"
7) "dd"
8) "cc"
9) "ZhangSan"
10) "WangWu"
redis 127.0.0.1:6379> lrem testList -2 ZhangSan
(integer) 2
redis 127.0.0.1:6379>
8>lindex,获取指定索引的元素值,index从0开始,用法:lindex key index
redis 127.0.0.1:6379> lrange testList 0 -1
1) "jj"
2) "ZhangSan"
3) "hh"
4) "ff"
5) "ee"
6) "dd"
7) "cc"
8) "WangWu"
redis 127.0.0.1:6379> lindex testList 5
"dd"
redis 127.0.0.1:6379>
9>lset,设置指定索引的元素值,用法:lset key index value
#设置第3个值为hello
redis 127.0.0.1:6379> lrange testList 0 -1
1) "jj"
2) "ZhangSan"
3) "hh"
4) "ff"
5) "ee"
6) "dd"
7) "cc"
8) "WangWu"
redis 127.0.0.1:6379> lset testList 3 hello
OK
redis 127.0.0.1:6379> lrange testList 0 -1
1) "jj"
2) "ZhangSan"
3) "hh"
4) "hello"
5) "ee"
6) "dd"
7) "cc"
8) "WangWu"
redis 127.0.0.1:6379>
10>ltrim,保留指定片段,用法:ltrim key start stop
redis 127.0.0.1:6379> lrange testList 0 -1
1) "ff"
2) "ee"
3) "dd"
4) "cc"
5) "bb"
6) "aa"
7) "hh"
8) "hello"
redis 127.0.0.1:6379> ltrim testList 2 6
OK
redis 127.0.0.1:6379> lrange testList 0 -1
1) "dd"
2) "cc"
3) "bb"
4) "aa"
5) "hh"
redis 127.0.0.1:6379>
11>linsert,向列表中插入元素,返回list的长度,用法:linsert key before|after privot value,从左边开始寻找值为privot的第一个元素,然后根据条件before|after决定在该元素前面还是后面插入value。
redis 127.0.0.1:6379> lrange testList 0 -1
1) "dd"
2) "cc"
3) "bb"
4) "aa"
5) "hh"
redis 127.0.0.1:6379> linsert testList after bb hello
(integer) 6
redis 127.0.0.1:6379> lrange testList 0 -1
1) "dd"
2) "cc"
3) "bb"
4) "hello"
5) "aa"
6) "hh"
redis 127.0.0.1:6379>
#4.集合
集合对外提供的功能与list大致相同,不同之处是set可以自动排除重复元素。
4.1应用场景:当我们需要存储一个列表数据,又不希望出现重复数据时,可以采用set。
4.2常用命令
1>sadd 添加元素,用法:sadd key value1 [value2……]
redis 127.0.0.1:6379> sadd testSet name sex age
(integer) 3
redis 127.0.0.1:6379>
2>smembers,获取集合中所有的元素,用法:smembers key
redis 127.0.0.1:6379> sadd testSet name sex age
(integer) 3
redis 127.0.0.1:6379> smembers testSet
1) "sex"
2) "age"
3) "name"
redis 127.0.0.1:6379>
3>srem,删除集合中元素,用法:srem key value1[value2……]
redis 127.0.0.1:6379> smembers testSet
1) "sex"
2) "age"
3) "name"
redis 127.0.0.1:6379> srem testSet age
(integer) 1
redis 127.0.0.1:6379> smembers testSet
1) "sex"
2) "name"
redis 127.0.0.1:6379>
4>sismember,判断元素是否在集合中,存在返回1;不存在返回0。用法:sismember key value
redis 127.0.0.1:6379> smembers testSet
1) "sex"
2) "name"
redis 127.0.0.1:6379> sismember testSet name
(integer) 1
redis 127.0.0.1:6379>
5>sdiff,对集合做差集运算,用法:sdiff key1 key2 [key3……],先计算key1与key2的差集,然后再用结果与key3做差集。
sinter,对集合做交集运算,用法同sdiff。
sunion,对集合做并集运算,用法同sdiff。
6>scard,获得集合中元素的个数,用法:scard key
redis 127.0.0.1:6379> smembers testSet
1) "sex"
2) "name"
redis 127.0.0.1:6379> scard testSet
(integer) 2
redis 127.0.0.1:6379>
#5.有序集合
与set相比较,sorted set提供了一个优先级(score)的参数来为成员排序,而且插入是有序的,即自动排序。
5.1应用场景:当我们需要一个有序且元素不重复的集合列表,就可以采用sorted set。
5.2常用命令
1>zadd,添加元素,用法:zadd key score1 value1
redis 127.0.0.1:6379> zadd testZset 5 zhangsan
(integer) 0
redis 127.0.0.1:6379>
2>zscore,获取元素的分数,用法:zscore key value
redis 127.0.0.1:6379> zadd testZset 5 zhangsan
(integer) 0
redis 127.0.0.1:6379> zscore testZset zhangsan
"5"
redis 127.0.0.1:6379>
如下的就不列举例子了,实际应用中去官网查手册。