什么是Redis
Redis(Remote Dictionary Server),即远程字典服务,是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis优点:
所有的命令都可以在Redis官网上进行查找
添加、查询、追加、获取长度、判断是否存在操作
127.0.0.1:6379> set name aaa #插入一个key为"name" value为"aaa"的数据
OK
127.0.0.1:6379> get name #获取key为"name"的value值
"aaa"
127.0.0.1:6379> KEYS * # 查看当前库的所有值
1) "name"
127.0.0.1:6379> EXISTS name #判断key为'name'的数据是否存在,存在放回1
(integer) 1
127.0.0.1:6379> EXISTS name1 # 不存在返回0
(integer) 0
127.0.0.1:6379> GET key
(nil)
127.0.0.1:6379> APPEND name bbbccc #追加到key为"name"的数据后拼接值为"bbbccc",如果key存在就类似于Java中字符串的"+",不存在则新增一个,并且返回该数据的总长度
(integer) 9
127.0.0.1:6379> GET name
"aaabbbccc"
127.0.0.1:6379> STRLEN name #查看key为'name'的字符串长度
(integer) 9
127.0.0.1:6379> get name
"aaabbbccc"
127.0.0.1:6379> set key1 "hello world!" #如果数据中有空格的数据,需要使用双引号否则会报错
OK
127.0.0.1:6379> set key1 hello world!
(error) ERR syntax error
127.0.0.1:6379> set key1 hello,world! #逗号是可以的
OK
自增、自减操作
127.0.0.1:6379> set num 0 #插入一个初始值为0的数据
OK
127.0.0.1:6379> get num
"0"
127.0.0.1:6379> INCR num #指定key为"num"的数据自增1,返回结果 相当于Java中的 i++
(integer) 1
127.0.0.1:6379> get num
"1"
127.0.0.1:6379> INCR num
(integer) 2
127.0.0.1:6379> INCR num
(integer) 3
127.0.0.1:6379> get num
"3"
127.0.0.1:6379> DECR num #指定key为"num"的数据自减1,返回结果 相当于Java中的 i--
(integer) 2
127.0.0.1:6379> DECR num
(integer) 1
127.0.0.1:6379> DECR num
(integer) 0
127.0.0.1:6379> DECR num
(integer) -1
127.0.0.1:6379> DECR num
(integer) -2
127.0.0.1:6379> DECRBY num 3 # num-3
(integer) -5
127.0.0.1:6379> INCRBY num 10# num+10
(integer) 5
截取、替换字符串操作
#截取
127.0.0.1:6379> set key "hello world!"
OK
127.0.0.1:6379> get key
"hello world!"
127.0.0.1:6379> GETRANGE key 0 4 # 截取字符串,相当于Java中的subString,从下标0开始,不会改变原有的数据
"hello"
127.0.0.1:6379> GETRANGE key 0 -1 # 0至-1相当于get key,获取整条数据
"hello world!"
#替换
127.0.0.1:6379> set key2 "hello,,,world!"
OK
127.0.0.1:6379> get key2
"hello,,,world!"
127.0.0.1:6379> SETRANGE key2 5 888 #此语句跟java中replace有点类似,下标也是从0开始,但是有区别:java中是指定替换字符,Redis中是从指定位置开始替换,替换的数据根据你所需替换的长度一致,返回值是替换后的长度
(integer) 14
127.0.0.1:6379> get key2
"hello888world!"
127.0.0.1:6379> SETRANGE key2 5 67 #此处只替换了两位
(integer) 14
127.0.0.1:6379> get key2
"hello678world!"
设置过期时间、不存在设置操作
#设置过期时间
127.0.0.1:6379> SETEX name1 15 aabbcc #新建一个key为"name1",值为"aabbcc",过期时间为15秒的字符串数据
OK
127.0.0.1:6379> ttl name1 #查看key为name1的key的过期时间
(integer) 7
127.0.0.1:6379> ttl name1
(integer) 6
127.0.0.1:6379> ttl name1
(integer) 3
127.0.0.1:6379> ttl name1 # 返回-2时证明key已经过期,即不存在
(integer) -2
#不存在设置
127.0.0.1:6379> SETNX name2 ddeeff #如果key为'name2'不存在,新增数据,返回值1为成功
(integer) 1
127.0.0.1:6379> get name2
"ddeeff"
127.0.0.1:6379> keys *
1) "name2"
127.0.0.1:6379> setnx name2 "aaabbbccc" #如果key为'name2'已存在,设置失败,返回值为0
(integer) 0
127.0.0.1:6379> get name2
"ddeeff"
mset、mget操作
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #插入多条数据
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "k3"
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> MSETNX k1 v1 k4 v4 #msetnx是一个原子性的操作,在一定程度上保证了事务!要么都成功,要么都失败!相当于if中的条件&&(与)
(integer) 0
127.0.0.1:6379> MSETNX k5 v5 k4 v4 #全部成功
(integer) 1
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
4) "k5"
5) "k4"
添加获取对象、getset操作
#这里其实本质上还是字符串,但是我们讲其key巧妙的设计了一下。
##mset student:1:name student 相当于类名,1 相当于id,name 相当于属性
#如果所需数据全部这样设计,那么我们在java的业务代码中,就不需要关注太多的key
#只需要找到student类,下面哪个id,需要哪个属性即可,减少了代码的繁琐,在一定程度上可以理解为这个一个类的对象!
127.0.0.1:6379> mset student:1:name aabbcc student:1:age 22 #新增一个key为‘student:1:name’,value为‘dingdada ’的数据
OK
127.0.0.1:6379> keys * #查看所有的key
1) "student:1:name"
2) "student:1:age"
127.0.0.1:6379> mget student:1:age student:1:name #获取数据
1) "22"
2) "aabbcc"
#getset操作
127.0.0.1:6379> GETSET name1 aabb #先get再set,先获取key,如果没有,set值进去,返回的是get的值
(nil)
127.0.0.1:6379> get name1
"aabb"
127.0.0.1:6379> GETSET name1 112233 #先获取key,如果有,set最新的值进去,返回get的值
"aabb"
127.0.0.1:6379> GETSET name1 #替换成功
"112233"
String是Redis中最常用的一种数据类型,也是Redis中最简单的一种数据类型。首先,表面上是字符串,但其实可以灵活的表示字符串、整数、浮点数3种值。Redis会自动识别这3种值。
lpush(左插入)、lrange(查询集合)、rpush(右插入)操作
#lpush
127.0.0.1:6379> LPUSH list v1 #新增一个集合
(integer) 1
127.0.0.1:6379> LPUSH list v2
(integer) 2
127.0.0.1:6379> LPUSH list v3
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1 #查询list的所有元素值
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> LPUSH list1 v1 v2 v3 v4 v5 #批量添加集合元素
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> LRANGE list1 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v2"
5) "v1"
# 这里先进去的会到后面
#rpush
127.0.0.1:6379> LRANGE list 0 1 #指定查询列表中的元素,从下标0开始,1结束,两个元素
1) "v3"
2) "v2"
127.0.0.1:6379> LRANGE list 0 0 #指定查询列表中的唯一元素
1) "v3"
127.0.0.1:6379> lpush list rv0 #右插入,跟lpush相反,这里添加进去元素是在尾部!
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1 #查看集合所有元素
1) "rv0"
2) "v3"
3) "v2"
4) "v1"
lpop(左移除)、rpop(右移除)操作
#lpop
127.0.0.1:6379> LRANGE list1 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v2"
5) "v1"
127.0.0.1:6379> lpop list1
"v5"
#rpop
127.0.0.1:6379> LRANGE list1 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> rpop list1
"v1"
127.0.0.1:6379> LRANGE list1 0 -1
1) "v4"
2) "v3"
3) "v2"
lindex(查询指定下标元素)、llen(获取集合长度)操作
#lindex
127.0.0.1:6379> LRANGE list1 0 -1
1) "v4"
2) "v3"
3) "v2"
127.0.0.1:6379> LRANGE list1 0 -1
1) "v4"
2) "v3"
3) "v2"
127.0.0.1:6379> LINDEX list1 1 #获取指定下标位置集合的元素,下标从0开始计数
"v3"
127.0.0.1:6379> LINDEX list1 0
"v4"
#llen
127.0.0.1:6379> llen list1 #获取指定集合的元素长度
(integer) 3
lrem(根据value移除指定的值)
127.0.0.1:6379> LRANGE list1 0 -1
1) "v4"
2) "v3"
3) "v2"
127.0.0.1:6379> lrem list1 1 v2 #移除集合list中的元素v2的元素1个
(integer) 1
127.0.0.1:6379> LRANGE list1 0 -1
1) "v4"
2) "v3"
127.0.0.1:6379> lrem list1 0 v3 #移除集合list中的元素v3的元素1个,这里0和1效果一样
(integer) 1
127.0.0.1:6379> lpush list1 v3 v2 v2 v2
(integer) 5
127.0.0.1:6379> LRANGE list1 0 -1
1) "v2"
2) "v2"
3) "v2"
4) "v3"
5) "v4"
127.0.0.1:6379> LREM list1 2 v2 #移除集合list中元素为v2 的‘2’个,这里的参数数量,如果实际中集合元素数量不达标,不会报错,全部移除后返回成功移除后的数量值
(integer) 2
127.0.0.1:6379> LRANGE list1 0 -1
1) "v2"
2) "v3"
3) "v4"
ltrim(截取元素)、rpoplpush(移除指定集合中最后一个元素到一个新的集合中)操作
#ltrim
127.0.0.1:6379> lpush list v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> LTRIM list 1 2 #通过下标截取指定的长度
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "v3"
2) "v2"
#rpoplpush
127.0.0.1:6379> lpush list v1 v2 v3 v4 v5
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v2"
5) "v1"
127.0.0.1:6379> RPOPLPUSH list newlist #移除list集合中的最后一个元素到新的集合newlist中,返回值是移除的最后一个元素值
"v1"
127.0.0.1:6379> LRANGE newlist 0 -1 #存在newlist集合并且有刚刚移除的元素
1) "v1"
lset(更新)、linsert操作
#lset
127.0.0.1:6379> LRANGE list 0 -1
1) "v5"
2) "v4"
3) "v3"
4) "v2"
127.0.0.1:6379> lset list 1 newV5 # 更新list集合中下标为'1'的元素为'newV5'
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "v5"
2) "newV5"
3) "v3"
4) "v2"
##注意
127.0.0.1:6379> lset list1 0 vvvv #如果指定的集合不在,报错
(error) ERR no such key
127.0.0.1:6379> lset list 8 vvv #如果集合存在,但是指定的下标不存在,报错
(error) ERR index out of range
#linsert
127.0.0.1:6379> LRANGE list 0 -1
1) "v5"
2) "newV5"
3) "v3"
4) "v2"
127.0.0.1:6379> LINSERT list after v3 insertv3 #在集合中的'v3'元素'(after)之后'加上一个元素
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "v5"
2) "newV5"
3) "v3"
4) "insertv3"
5) "v2"
127.0.0.1:6379> LINSERT list before v3 insertv3 #在集合中的'v3'元素'(before)之后'加上一个元素
(integer) 6
127.0.0.1:6379> LRANGE list 0 -1
1) "v5"
2) "newV5"
3) "insertv3"
4) "v3"
5) "insertv3"
6) "v2"
sadd(添加)、smembers(查看所有元素)、sismember(判断是否存在)、scard(查看长度)、srem(移除指定元素)操作
127.0.0.1:6379> sadd set1 aa bb cc dd #添加set集合
(integer) 4
127.0.0.1:6379> SMEMBERS set1
1) "bb"
2) "aa"
3) "dd"
4) "cc"
127.0.0.1:6379> SISMEMBER set1 aa
(integer) 1
127.0.0.1:6379> SISMEMBER set1 aab
(integer) 0
127.0.0.1:6379> SCARD set1
(integer) 4
127.0.0.1:6379> srem set1 aa
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "bb"
2) "dd"
3) "cc"
srandmember(抽随机)操作
127.0.0.1:6379> sadd myset 1 2 3 4 5 6 7
(integer) 7
127.0.0.1:6379> SMEMBERS myset
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
127.0.0.1:6379> SRANDMEMBER myset 1 #从set中随机取一个数
1) "7"
127.0.0.1:6379> SRANDMEMBER myset 1
1) "4"
127.0.0.1:6379> SRANDMEMBER myset 1
1) "3"
127.0.0.1:6379> SRANDMEMBER myset 3 #从set中随机取三个数
1) "2"
2) "6"
3) "4"
127.0.0.1:6379> SRANDMEMBER myset 3
1) "2"
2) "3"
3) "7"
spop(随机删除元素)、smove(移动指定元素到新的集合中)操作
127.0.0.1:6379> spop myset #随机删除一个元素
"5"
127.0.0.1:6379> spop myset 1 #随机删除一个元素
1) "4"
127.0.0.1:6379> spop myset 2 #随机删除两个元素
1) "1"
2) "2"
127.0.0.1:6379> SMEMBERS myset
1) "3"
2) "6"
3) "7"
127.0.0.1:6379> SMOVE myset myset2 3 #移动指定set中的元素到新的set中
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "6"
2) "7"
127.0.0.1:6379> SMEMBERS myset2
1) "3"
sdiff(差集)、sinter(交集)、sunion(并集)操作
127.0.0.1:6379> sadd myset 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd myset2 3 4 5 6 7
(integer) 5
127.0.0.1:6379> SMEMBERS myset
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> SMEMBERS myset2
1) "3"
2) "4"
3) "5"
4) "6"
5) "7"
127.0.0.1:6379> SDIFF myset myset2 #差集
1) "1"
2) "2"
127.0.0.1:6379> SINTER myset myset2 #并集
1) "3"
2) "4"
3) "5"
127.0.0.1:6379> SUNION myset myset2 #交集
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
hset(添加hash)、hget(查询)、hgetall(查询所有)、hdel(删除hash中指定的值)、hlen(获取hash的长度)、hexists(判断key是否存在)
127.0.0.1:6379> hset hash1 name aaa age 20 #添加hash,可添加多个
(integer) 2
127.0.0.1:6379> hget hash1 name # 获取hash中key是name的值
"aaa"
127.0.0.1:6379> hget hash1 age
"20"
127.0.0.1:6379> HGETALL hash1 #获取hash中全部的值包括key
1) "name"
2) "aaa"
3) "age"
4) "20"
127.0.0.1:6379> hset hash1 del test
(integer) 1
127.0.0.1:6379> HGETALL hash1
1) "name"
2) "aaa"
3) "age"
4) "20"
5) "del"
6) "test"
127.0.0.1:6379> HDEL hash1 del age # 删除指定的hash中的key(可多个),key删除后对应的value也会删除
(integer) 2
127.0.0.1:6379> HGETALL hash1
1) "name"
2) "aaa"
127.0.0.1:6379> HLEN hash1 #获取指定的hash的长度
(integer) 1
127.0.0.1:6379> HEXISTS hash1 name # 判断key是否存在于指定的value中,存在返回1
(integer) 1
127.0.0.1:6379> HEXISTS hash1 age # 不存在返回0
(integer) 0
hkeys(获取所有的key)、hval(获取所有value)、hincrby(给值加增量)、hsetnx(存在不添加)操作
127.0.0.1:6379> hset hash1 age 20 hight 180
(integer) 2
127.0.0.1:6379> hgetall hash1
1) "name"
2) "aaa"
3) "age"
4) "20"
5) "hight"
6) "180"
127.0.0.1:6379> HKEYS hash1 #获取指定hash中所有的key
1) "name"
2) "age"
3) "hight"
127.0.0.1:6379> HVALS hash1 #获取指定hash中所有的val
1) "aaa"
2) "20"
3) "180"
127.0.0.1:6379> HINCRBY hash1 age 2 #让hash中age的value指定+2(自增)
(integer) 22
127.0.0.1:6379> HINCRBY hash1 age -1 #让hash中age的value指定-1(自减)
(integer) 21
127.0.0.1:6379> HSETNX hash1 nokey novalue #添加hash中不存在的值返回新增成功的数量
(integer) 1
127.0.0.1:6379> HSETNX hash1 name haha #添加存在则失败返回0
(integer) 0
127.0.0.1:6379> HGETALL hash1
1) "name"
2) "aaa"
3) "age"
4) "21"
5) "hight"
6) "180"
7) "nokey"
8) "novalue"
zadd(添加)、zrange(查询)、zrangebyscore(排序小-大)、zrevrange(排序大-小)、zrangebyscore withscores(查询所有值包含key)
127.0.0.1:6379> zadd zset 1 one 2 two 3 three #添加多个zset值
(integer) 3
127.0.0.1:6379> ZRANGE zset 0 -1 #查询所有的值
1) "one"
2) "two"
3) "three"
# -inf 代表负无穷 +inf代表正无穷
127.0.0.1:6379> ZRANGEBYSCORE zset -inf +inf #将zset按从小到大排序并输出
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> ZRANGEBYSCORE zset 0 1 #只查询key<=1的值并且排序从小到大
1) "one"
127.0.0.1:6379> ZREVRANGE zset 1 -1 #从大到小排序输出
1) "two"
2) "one"
127.0.0.1:6379> ZRANGEBYSCORE zset -inf +inf withscores #查询指定zset的所有值,包含序号的值
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
zrem(移除元素)、zcard(查看元素个数)、zcount(查询指定区间内的元素个数)操作
127.0.0.1:6379> zadd set 1 v1 2 v2 3 v3 4 v4
(integer) 4
127.0.0.1:6379> ZRANGE set 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> zrem set v3 #移除指定元素,可多个
(integer) 1
127.0.0.1:6379> ZRANGE set 0 -1
1) "v1"
2) "v2"
3) "v4"
127.0.0.1:6379> ZCARD set #查看元素个数
(integer) 3
127.0.0.1:6379> ZCOUNT set 0 100 #查看指定区间的元素个数
(integer) 3
127.0.0.1:6379> ZCOUNT set 0 2
(integer) 2
以上就是Redis的五大类型的使用,关于其他命令都可以在外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=r&pos_id=img-SWDR0SC1-1701160381600)上进行查找。
“one”
2) “1”
3) “two”
4) “2”
5) “three”
6) “3”
2. zrem(移除元素)、zcard(查看元素个数)、zcount(查询指定区间内的元素个数)操作
```shell
127.0.0.1:6379> zadd set 1 v1 2 v2 3 v3 4 v4
(integer) 4
127.0.0.1:6379> ZRANGE set 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> zrem set v3 #移除指定元素,可多个
(integer) 1
127.0.0.1:6379> ZRANGE set 0 -1
1) "v1"
2) "v2"
3) "v4"
127.0.0.1:6379> ZCARD set #查看元素个数
(integer) 3
127.0.0.1:6379> ZCOUNT set 0 100 #查看指定区间的元素个数
(integer) 3
127.0.0.1:6379> ZCOUNT set 0 2
(integer) 2
以上就是Redis的五大类型的使用,关于其他命令都可以在官网上进行查找。