Redis五大数据类型

在这里插入图片描述
可用作数据库、缓存和消息中间件MQ

Redis-Key

在这里插入图片描述
在这里插入图片描述
ttl name查看当前key的剩余时间
在这里插入图片描述
查看当前key的类型

String(字符串)

90%的java程序员使用redis只会使用String类型!(避免)

127.0.0.1:6379> set key1 v1	#设置值
OK
127.0.0.1:6379> get key1	#获得值
"v1"
127.0.0.1:6379> keys *		#获得所有的值
1) "key1"
127.0.0.1:6379> EXISTS key1	#判断某一个key是否存在 	
(integer) 1
127.0.0.1:6379> APPEND key1 "hello"	#追加字符串,如果当前key不存在,就相当于setkey
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> strlen key1		#获取字符串的长度
(integer) 7
127.0.0.1:6379> APPEND key1 ",kuangshen"
(integer) 17
127.0.0.1:6379> strlen key1
(integer) 17
127.0.0.1:6379> get key1
"v1hello,kuangshen"
127.0.0.1:6379>
#########################################################
#i++
#步长 i+=
127.0.0.1:6379> set views 0	#初始量为0		
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views	#自增1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views	#自减1
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> decr views
(integer) -1
127.0.0.1:6379> get views
"-1"
127.0.0.1:6379> INCRBY views 10	#可以设置步长,自动增长的量
(integer) 9
127.0.0.1:6379> INCRBY views 10
(integer) 19
127.0.0.1:6379> decrby views 5	#可以设置步长,自减的量
(integer) 14
127.0.0.1:6379>
##########################################################
#字符串范围range
127.0.0.1:6379> set key1 "hello,kuangshen"	#设置key1的值
OK
127.0.0.1:6379> get key1
"hello,kuangshen"
127.0.0.1:6379> GETRANGE key1 0 3	#截取字符串[0,3]
"hell"
127.0.0.1:6379> GETRANGE key1 0 -1	#获取全部的字符串和get key是一样的
"hello,kuangshen"
#替换!
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> SETRANGE key2 1 xx	#替换指定位置开始的字符串!
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
###########################################################
# setex(set with expire)	#设置过期时间
# setnx(set if not exist)	#不存在设置(在分布式锁中会常常使用!)
127.0.0.1:6379> setex key3 30 "hello"	#设置key3的值为hello,30秒后过期
OK
127.0.0.1:6379> ttl
(error) ERR wrong number of arguments for 'ttl' command
127.0.0.1:6379> ttl
(error) ERR wrong number of arguments for 'ttl' command
127.0.0.1:6379> ttl key3
(integer) 17
127.0.0.1:6379> setnx mykey "redis"	#如果mykey不存在,创建mykey
(integer) 1
127.0.0.1:6379> keys *
1) "mykey"
2) "key2"
3) "key1"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey "mongoDB"	#如果mykey存在,创建失败!
(integer) 0
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379>
###########################################################
mset
mget


127.0.0.1:6379> keys *
(empty list or set)
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是一个原子性的操作,要么一起成功,么要一起失败!
(integer) 0
127.0.0.1:6379> get key4
(nil)
127.0.0.1:6379>

#	对象
set user:1 {name:zhangsan,age:3} #设置一个user:1对象 值为json字符串来保存一个对象!

#这里的key是一个巧妙地设计: user;{id}:{filed},如此设计在Redis中是完全可以的!

127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"
###########################################################
getset #先get再set
127.0.0.1:6379> getset db redis	    #如果不存在值,返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongdb	#如果存在值,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongdb"

###########################################################

数据结构是相同的!

String类型的使用场景:value除了是我们的字符串还可以是我们的数字!

···计数器

···统计多单位的数量 uid:xxxxxx:follow 0 incr

···粉丝数

···对象缓存存储!

List

基本的数据类型,列表

在redis里面,可以吧list弄成,栈、队列、阻塞队列!

所有的list命令都是L开头的
redis不区分大小写

#############################################################
127.0.0.1:6379> LPUSH list one	#将一个或多个值,插入到列表的头部(左)
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1	#获取list中的值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LRANGE list 0 1		#通过区间获取具体的值
1) "three"
2) "two"
127.0.0.1:6379> RPUSH list right	#将一个或多个值,插入到列表的尾部(右)
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
##################################################################
LPOP
RPOP
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> LPOP list	#移除list的第一个元素
"three"
127.0.0.1:6379> RPOP list	#移除list的最后一个元素
"right"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
####################################################################
Lindex

127.0.0.1:6379> lindex list 1	#通过下标获取list中的某一个值
"one"
127.0.0.1:6379> lindex list 0
"two"
####################################################################
Llen
127.0.0.1:6379> Lpush list one
(integer) 1
127.0.0.1:6379> Lpush list two
(integer) 2
127.0.0.1:6379> Lpush list three
(integer) 3
127.0.0.1:6379> Llen list	#返回列表的长度
(integer) 3

####################################################################
移除指定的值!
取关的操作 uid 
Lrem

127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one	#移除list集合中指定个数的value,精准匹配
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 1 three
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
127.0.0.1:6379> Lpush list three
(integer) 3
127.0.0.1:6379> lrem list 2 three
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
####################################################################
trim 修剪:list  截断
127.0.0.1:6379> Rpush mylist "hello"
(integer) 1
127.0.0.1:6379> Rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> Rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> Rpush mylist "hello3"
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2	#通过下标截取指定的长度,这个list已经被改变了,截断了只剩下截取的元素!
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello1"
2) "hello2"
####################################################################
rpoplpush #移除列表的最后一个元素,并移动到新的列表中
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpoplpush mylist myotherlist
"hello2"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange myotherlist 0 -1
1) "hello2"
####################################################################
lset 将列表中指定下标的值替换成另外一个值,相当于更新操作

127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> LRANGE list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 item	#存在,更新下标的值
OK
127.0.0.1:6379> LRANGE list 0 0
1) "item"
127.0.0.1:6379> lset list 1 other	#如果不存在列表会报错
(error) ERR index out of range

####################################################################
linsert	#将某一个具体的value插入到列表中某个元素的前面或者后面

127.0.0.1:6379> Rpush mylist "hello"
(integer) 1
127.0.0.1:6379> Rpush mylist "world"
(integer) 2
127.0.0.1:6379> LINSERT mylist before "world" "other"
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> LINSERT mylist after "world" "new"
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"
小结:
他实际上是一个链表,before Node after, left ,right都可以插入值
~ 如果key不存在,创建新的链表
~ 如果key存在,新增内容
~ 如果移除了所有值,空链表,也代表不存在!
~ 在两边插入或者改动值,效率最高!中间元素,相对来说,效率会低一点
消息队列!消息队列 (Lpush Rpop) 栈 (Lpush Lpop)

set(集合)

set中的值是不能重读的!

####################################################################
127.0.0.1:6379> sadd myset "hello"	#set集合中添加元素
(integer) 1
127.0.0.1:6379> sadd myset "kuangshen"
(integer) 1
127.0.0.1:6379> sadd myset "lovekuangshen"
(integer) 1
127.0.0.1:6379> SMEMBERS myset	#查看指定set的所有值
1) "hello"
2) "kuangshen"
3) "lovekuangshen"
127.0.0.1:6379> SISMEMBER myset hello	#判断某一个值是不是在set集合中
(integer) 1
127.0.0.1:6379> SISMEMBER myset world
(integer) 0

####################################################################
127.0.0.1:6379> scard myset	#获取set集合中的内容元素个数!
(integer) 4

####################################################################
rem

127.0.0.1:6379> srem myset hello	#移除set集合中的指定元素
(integer) 1
127.0.0.1:6379> scard myset
(integer) 3
127.0.0.1:6379> SMEMBERS myset
1) "kuangshen"
2) "lovekuangshen2"
3) "lovekuangshen"
####################################################################
set 无序不重复集合:抽随机!
127.0.0.1:6379> SRANDMEMBER myset	#随机抽选出一个元素
"lovekuangshen2"
127.0.0.1:6379> SRANDMEMBER myset
"lovekuangshen2"
127.0.0.1:6379> SRANDMEMBER myset
"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset 2	#随机抽选指定个数的元素
1) "lovekuangshen"
2) "lovekuangshen2"

####################################################################
删除指定的key,随机删除key!
127.0.0.1:6379> SMEMBERS myset
1) "kuangshen"
2) "lovekuangshen2"
3) "lovekuangshen"
127.0.0.1:6379> spop myset	#随机删除一些set集合中的元素
"kuangshen"
127.0.0.1:6379> SMEMBERS myset
1) "lovekuangshen2"
2) "lovekuangshen"
127.0.0.1:6379> spop myset
"lovekuangshen2"
127.0.0.1:6379> SMEMBERS myset
1) "lovekuangshen"

####################################################################
将一个指定的值,移动到另外一个set集合!
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> sadd myset "kuangshen"
(integer) 1
127.0.0.1:6379> sadd myset2 "set2"
(integer) 1
127.0.0.1:6379> smove myset myset2 "kuangshen"  #将一个指定的值,移动到另外一个set集合
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "hello"
2) "world"
127.0.0.1:6379> SMEMBERS myset2
1) "kuangshen"
2) "set2"
127.0.0.1:6379>

####################################################################
微博,B站,共同关注!(并集)
数字集合类: 
~ 差集
~ 交集
~ 并集
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> SDIFF key1 key2		#差集
1) "a"
2) "b"
127.0.0.1:6379> SINTER key1 key2	#交集	共同好友就可以这样实现
1) "c"
127.0.0.1:6379> SUNION key1 key2	#并集
1) "a"
2) "b"
3) "e"
4) "c"
5) "d"

微博,A用户将所有关注的人放在一个set集合中!将他的粉丝也放在一个集合中

共同关注,共同爱好,二度好友,推荐好友!(六度分割理论)

Hash (哈希)

Map集合,key-Map集合!这时候这个值是一个map集合!本质和String类型没有太大区别,还是一个简单的key-value!

set myhash field kuangshen

####################################################################
127.0.0.1:6379> hset myhash field kuangshen	#set一个具体key-value
(integer) 1
127.0.0.1:6379> hget myhash field #获取一个字段值
"kuangshen"
127.0.0.1:6379> hmset myhash field hello field2 world #set多个key-value
OK
127.0.0.1:6379> hmget myhash field field2 #获取多个字段值
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash #获取全部的数据
1) "field"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hdel myhash field #删除hash指定key字段!对应的value也就消失了!
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
####################################################################
hlen
127.0.0.1:6379> hmset myhash field1 hello field2 world
OK
127.0.0.1:6379> HGETALL myhash
1) "field2"
2) "world"
3) "field1"
4) "hello"
127.0.0.1:6379> hlen myhash	#获取hash表的字符数量
(integer) 2
####################################################################
127.0.0.1:6379> HEXISTS myhash field1	#判断hash中指定字段是否存在
(integer) 1
127.0.0.1:6379> HEXISTS myhash field2
(integer) 1
127.0.0.1:6379> HEXISTS myhash field3
(integer) 0
####################################################################
#只获得所有field
#只获得所有value
127.0.0.1:6379> hkeys myhash	#只获得所有field
1) "field2"
2) "field1"
127.0.0.1:6379> hvals myhash	#只获得所有value
1) "world"
2) "hello"

####################################################################
incr  decr
127.0.0.1:6379> hset myhash field3 5	#指定增量
(integer) 1
127.0.0.1:6379> HINCRBY myhash field3 1
(integer) 6
127.0.0.1:6379> HINCRBY myhash field3 -1
(integer) 5
127.0.0.1:6379> hsetnx myhash field4 hello	#如果不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 hello	#如果存在则不可以设置
(integer) 0

hash变更的数据user name age 尤其是用户信息之类的,经常变动的信息!

hash更适合于对象的存储!String更加适合字符串存储!

Zset(有序集合)

在set的基础上,增加了一个值, set k1 v1 zset k1 score1 v1

127.0.0.1:6379> zadd myset 1 one	#添加一个值
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three	#添加多个值
(integer) 2
127.0.0.1:6379> ZRANGE myset 0 -1
1) "one"
2) "two"
3) "three"

####################################################################
127.0.0.1:6379> zadd salary 2500 xiaohong	#添加三个用户,薪水
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 500 kuangshen
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf	#按照从小到大排序显示
1) "kuangshen"
2) "xiaohong"
3) "zhangsan"	
127.0.0.1:6379> ZREVRANGE salary 0 -1	#按照从大到小进行排序
1) "zhangsan"
2) "kuangshen"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores	#按照从小到大排序显示,并且附带成绩
1) "kuangshen"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores	#显示工资小于2500员工的升序排列!
1) "kuangshen"
2) "500"
3) "xiaohong"
4) "2500"

#####################################################################
#移除rem中的元素
127.0.0.1:6379> ZRANGE salary 0 -1
1) "kuangshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrem salary xiaohong	#移除小红
(integer) 1
127.0.0.1:6379> ZRANGE salary 0 -1
1) "kuangshen"
2) "zhangsan"
127.0.0.1:6379> ZCARD salary	#获取有序集合中的个数
(integer) 2

#####################################################################
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 kuangshen
(integer) 2
127.0.0.1:6379> zcount myset 1 3	#获取指定区间的成员数量!
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2

#####################################################################

其余的一些API,通过学习,剩下的如果工作中有需要,这个时候可以去查看官方文档。

案例思路:set 排序 存储班级成绩表,工资表排序!

普通消息,1,重要消息2,带权重进行判断!

排行榜应用实现,取Top N测试!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

协奏曲❤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值