Redis

Stella981
• 阅读 495

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>

如下的就不列举例子了,实际应用中去官网查手册。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Redis进阶应用:Redis+Lua脚本实现符合操作
!(https://oscimg.oschina.net/oscnet/835168748db35a7a20a2e4f148db89ce4f8.png)一、引言Redis是高性能的keyvalue数据库,在很大程度克服了memcached这类key/value存储的不足,在部分场景下,是对关系数据库的良好补充。得益于超
Stella981 Stella981
3年前
Redis都有哪些数据类型
string这是最基本的类型了,就是普通的set和get,做简单的kv缓存hash这个是类似map的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存在redis里,然后每次读写缓存的时候,可以操作hash里的某个字段。key150value{“id”:
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
3年前
CAS 实现站内单点登录及实现第三方 OAuth、OpenId 登录(四)
一、OAuth配置1.配置OAuth提供商<bean id"weibo" class"com.buession.oauth.provider.impl.WeiboProvider"    <property name"key" value"the_key_for_
3A网络 3A网络
2年前
Redis 存储对象信息是用 Hash 还是 String
Redis存储对象信息是用Hash还是StringRedis内部使用一个RedisObject对象来表示所有的key和value,RedisObject中的type,则是代表一个value对象具体是何种数据类型,它包含字符串(String)、链表(List)、哈希结构(Hash)、集合(Set)、有序集合(Sortedset)。