redis五大数据类型

基本操作命令

127.0.0.1:6379> set name fx		#设置key值
OK
127.0.0.1:6379> get name		#获取key值
"fx"
127.0.0.1:6379> select 1		#切换数据库 (redis默认有16个数据库,默认是第0个)
OK
127.0.0.1:6379[1]> dbsize 		# 查看db数据库大小
(integer) 0
127.0.0.1:6379[1]> set name zfx
OK
127.0.0.1:6379[1]> dbsize
(integer) 1
127.0.0.1:6379[1]> keys *		#查看数据库所有的key
1) "name"
127.0.0.1:6379[1]> flushdb		#清空当前库
OK
127.0.0.1:6379[1]> keys *
(empty array)
127.0.0.1:6379[1]> set name zfx
OK
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> flushall		#清空所有库的内容
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty array)
127.0.0.1:6379[1]> 
127.0.0.1:6379> set name fx
OK
127.0.0.1:6379> set name fanlan
OK
127.0.0.1:6379> keys *·
1) "name"
127.0.0.1:6379> get name
"fanlan"
127.0.0.1:6379> exists name			# 判断当前的key是否存在
(integer) 1
127.0.0.1:6379> exists key 
(integer) 0
127.0.0.1:6379> del name			#删除指定索引的值
(integer) 1
127.0.0.1:6379> set name fanlan 
OK
127.0.0.1:6379> move name 1			# 移除当前的key
(integer) 1
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name fanlan
OK
127.0.0.1:6379> expire name 5		# 设置key的过期时间,单位是秒
(integer) 1
127.0.0.1:6379> ttl name			#查看过期时间还剩多少秒!!!!
(integer) -2
127.0.0.1:6379> get name			#过期后获取不到(nil)
(nil)
127.0.0.1:6379> set name fanlan
OK
127.0.0.1:6379> type name			# 查看当前key的一个类型!
string
127.0.0.1:6379>

String(字符串)

127.0.0.1:6379> keys *			#查看所有的key
1) "name"
127.0.0.1:6379> get name
"fanlan"
127.0.0.1:6379> append name fx	# 追加字符串
(integer) 8
127.0.0.1:6379> get name
"fanlanfx"
127.0.0.1:6379> strlen name		#获取字符串长度
(integer) 8
127.0.0.1:6379> append key fanlan	# 追加字符串,如果当前key不存在,就相当于setkey
(integer) 6
127.0.0.1:6379> get key
"fanlan"
127.0.0.1:6379> set woshifanlan 0	# 初始浏览量为0
OK
127.0.0.1:6379> get woshifanlan		
"0"
127.0.0.1:6379> incr woshifanlan	#自增+1
(integer) 1
127.0.0.1:6379> incr woshifanlan	#自增+1
(integer) 2
127.0.0.1:6379> decr woshifanlan	#自减-1
(integer) 1
127.0.0.1:6379> decr woshifanlan	#自减-1
(integer) 0
127.0.0.1:6379> incrby woshifanlan 5	#设置步长i+=5,指定增量
(integer) 5
127.0.0.1:6379> incr woshifanlan		
(integer) 6
127.0.0.1:6379> incr woshifanlan
(integer) 7
# 字符串范围 range
127.0.0.1:6379> set name woshifanlan	 # 设置 name 的值	
OK
127.0.0.1:6379> setrange name 0 4		# 替换指定索引位置的字符串
(integer) 11
127.0.0.1:6379> getrange name 0 4		#截取字符串name[0,4]
"4oshi"
127.0.0.1:6379> get name
"4oshifanlan"
127.0.0.1:6379> setrange name 0 w
(integer) 11
127.0.0.1:6379> get name 
"woshifanlan"
127.0.0.1:6379> getrange name 5 10		#截取字符串name[5,10],
"fanlan"
127.0.0.1:6379> getrange name 0 -1		#获取全部的字符串 和 get key 含义一样
"woshifanlan"


# setex (set with expire) # 设置过期时间
# setnx (set if not exist) # 不存在在设置 (在分布式锁中会常常使用!)
127.0.0.1:6379> setex name 30 woshifanlan	#设置key值过期时间,30秒后过期
OK
127.0.0.1:6379> ttl name		#查看过期时间还剩多少秒!!!!
(integer) 23
127.0.0.1:6379> setnx key fanlan	#设置key,不存在创建,存在,创建失败
(integer) 1
127.0.0.1:6379> get key
"fanlan"
127.0.0.1:6379> setnx key fanlan	# 如果key存在,创建失败!
(integer) 0
127.0.0.1:6379> get key	
"fanlan"
127.0.0.1:6379> keys *		#查看数据库当中所有key
1) "key"
mset	#同时设置多个值
mget	#同时获取多个值
127.0.0.1:6379> mset name fanlan name1 woshifanlan	# 同时设置多个值
OK
127.0.0.1:6379> mget name name1		# 同时获取多个值
1) "fanlan"
2) "woshifanlan"
127.0.0.1:6379> 
127.0.0.1:6379> msetnx name fanlan name1 woshifanlan # msetnx 是一个原子性的操作,要么一起成功,要么一起失败
(integer) 1
127.0.0.1:6379> set fx:1 {name:fanlan,age:21}	# 设置一个user:1 对象 值为 json字符来保存一个对象!
# 这里的key是一个巧妙的设计: user:{id}:{filed} , 如此设计在Redis中是完全OK了!
OK
127.0.0.1:6379> get fx:1
"{name:fanlan,age:21}"

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"
 # 先get然后在set
127.0.0.1:6379> getset name fanlan 	#如果key 不存在,返回nil
(nil)
127.0.0.1:6379> getset name woshifanlan	#如果key存在,获取原来的值,并设置新值
"fanlan"
127.0.0.1:6379> get name		#获取新值
"woshifanlan"
127.0.0.1:6379> 

数据结构是相同的!
String类似的使用场景:value除了是我们的字符串还可以是我们的数字!

1.计数器
2.统计多单位的数量
3.粉丝数
4.对象缓存存储

List(列表)

在redis里面,我们可以把list玩成 ,栈、队列、阻塞队列!
所有的list命令都是用l开头的,Redis不区分大小命令

127.0.0.1:6379> lpush name fanlan	# 将一个值或者多个值,插入到列表头部 (左)
(integer) 1
127.0.0.1:6379> lpush name woshifanlan
(integer) 2
127.0.0.1:6379> lpush name fx
(integer) 3
127.0.0.1:6379> lrange name 0 2	#通过区间获取list列表中值
1) "fx"
2) "woshifanlan"
3) "fanlan"
127.0.0.1:6379> lrange name 0 -1	#通过区间获取list列表中所有值
1) "fx"
2) "woshifanlan"
3) "fanlan"
127.0.0.1:6379> rpush name zfx	#将一个值或者多个值,插入到列表右边
(integer) 4
127.0.0.1:6379> lrange name 0 -1	#通过区间获取list列表中所有值
1) "fx"
2) "woshifanlan"
3) "fanlan"
4) "zfx"
127.0.0.1:6379> 
LPOP	#移除list列表左边值
RPOP	#移除list列表右边值
127.0.0.1:6379> lrange name 0 -1
1) "fx"
2) "woshifanlan"
3) "fanlan"
4) "zfx"
127.0.0.1:6379> lpop name	#移除list列表左边值
"fx"
127.0.0.1:6379> rpop name	#移除list列表右边值
"zfx"
127.0.0.1:6379> lrange name 0 -1
1) "woshifanlan"
2) "fanlan"
127.0.0.1:6379> 

Lindex 	#通过下标获取list值
127.0.0.1:6379> lrange name 0 -1
1) "woshifanlan"
2) "fanlan"
127.0.0.1:6379> lindex name 0		#通过下标(0)获取list值
"woshifanlan"
127.0.0.1:6379> lindex name 1		#通过下标(1)获取list值
"fanlan"
127.0.0.1:6379> 

llen #获取list列表的长度
127.0.0.1:6379> lrange name 0 -1
1) "woshifanlan"
2) "fanlan"
127.0.0.1:6379> llen name		#获取list列表的长度
(integer) 2
127.0.0.1:6379> 
lrem  #移除list列表中值
127.0.0.1:6379> lpush key one
(integer) 1
127.0.0.1:6379> lpush key two
(integer) 2
127.0.0.1:6379> lpush key three
(integer) 3
127.0.0.1:6379> lrange key 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrem key 1 one
(integer) 1
127.0.0.1:6379> lrange key 0 -1
1) "three"
2) "two"
127.0.0.1:6379> lpush key one
(integer) 3
127.0.0.1:6379> rpush key one
(integer) 4
127.0.0.1:6379> lrange key 0 -1
1) "one"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem key 2 one      #移除list列表中的值[可选移除相同的值]
(integer) 2
127.0.0.1:6379> lrange key 0 -1
1) "three"
2) "two"
ltrim #截取list列表中的值
127.0.0.1:6379> ltrim key 0 1	#截取list列表中的值,截掉指定范围,剩余列表中的值
OK
127.0.0.1:6379> lrange key 0 -1
1) "three"
2) "two"
127.0.0.1:6379> 
rpoplpush # 移除列表的最后一个元素(右),将他移动到新的列表中!
127.0.0.1:6379> lpush key one 
(integer) 1
127.0.0.1:6379> lpush key two
(integer) 2
127.0.0.1:6379> lpush key three
(integer) 3
127.0.0.1:6379> lpush key1 four
(integer) 1
127.0.0.1:6379> lrange key 0 -1	# 查看原来的列表(key)
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange key1 0 -1	# 查看原来的列表(key1)
1) "four"
127.0.0.1:6379> rpoplpush key key1 	# 移除列表中最后一个元素,并将移除元素添加到新列表中
"one"
127.0.0.1:6379> lrange key 0 -1	#查看移除的列表
1) "three"
2) "two"
127.0.0.1:6379> lrange key1 0 -1 #查看新填的列表
1) "one"
2) "four"
lset 将列表中指定下标的值替换为另外一个值,更新操作
127.0.0.1:6379> lpush key fanlan		
(integer) 1
127.0.0.1:6379> lpush key woshifanlan
(integer) 2
127.0.0.1:6379> lrange key 0 -1		#获取list指定范围的值
1) "woshifanlan"
2) "fanlan"
127.0.0.1:6379> lset key 0 fx	#更新list列表指定下标的存在时,会替换
OK
127.0.0.1:6379> lrange key 0 -1
1) "fx"
2) "fanlan"
127.0.0.1:6379> lset key 2 fanlan #更新list列表,索引不存在时会包错
(error) ERR index out of range

linsert # 将某个具体的value插入到指定某个元素的前后
127.0.0.1:6379> lrange key 0 -1	#
1) "fx"
2) "fanlan"
127.0.0.1:6379> linsert key before fanlan woshifanlan	#将我是泛滥插入到fanlan前面
(integer) 3
127.0.0.1:6379> lrange key 0 -1
1) "fx"
2) "woshifanlan"
3) "fanlan"
127.0.0.1:6379> linsert key after fanlan zfx	#将我是泛滥插入到fanlan后面
(integer) 4
127.0.0.1:6379> lrange key 0 -1		#获取指定list区间的值
1) "fx"
2) "woshifanlan"
3) "fanlan"
4) "zfx"
127.0.0.1:6379> 
实际上是一个链表,before Node after , left,right 都可以插入值
如果key 不存在,创建新的链表
如果key存在,新增内容
如果移除了所有值,空链表,也代表不存在!
在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点~

消息排队!消息队列 (Lpush Rpop), 栈( Lpush Lpop)!

Set(集合)

set中的值是不能重读的!

在这里插入代码片

Set(集合)
set中的值是不能重读的!

127.0.0.1:6379> sadd name fanlan    #向集合中添加元素
(integer) 1
127.0.0.1:6379> sadd name woshifanlan
(integer) 1
127.0.0.1:6379> sadd name fanlan
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> smembers name       #查看集合当中的元素
1) "fanlan"
2) "woshifanlan"
127.0.0.1:6379> sismember name fanlan   #判断集合中是否有这个元素   1 表示 有
(integer) 1
127.0.0.1:6379> sismember name fx       #判断集合中是否有这个元素   0 表示 没有
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> scard name  #获取集合当中元素的个数len的作用一样
(integer) 2
127.0.0.1:6379>
127.0.0.1:6379> scard name  #查看集合当中元素的个数
(integer) 2
127.0.0.1:6379> smembers name   #查看set集合当中所有的值
1) "fanlan"
2) "woshifanlan"
127.0.0.1:6379> srem name fanlan    #移除集合当中指定的值
(integer) 1 
127.0.0.1:6379> smembers name   
1) "woshifanlan"
127.0.0.1:6379> sadd name fanlan    #向集合当中添加值
(integer) 1
127.0.0.1:6379> sadd name zfx
(integer) 1
127.0.0.1:6379> sadd name fx
(integer) 1
127.0.0.1:6379> smembers name       #查看集合当中的值
1) "zfx"
2) "fanlan"
3) "fx"
4) "woshifanlan"
127.0.0.1:6379> srandmember name    # 随机抽选出一个元
"fx"
127.0.0.1:6379> srandmember name 2
1) "fanlan"
2) "woshifanlan"
127.0.0.1:6379>
127.0.0.1:6379> smembers name   #查看集合中的所有值
1) "zfx"
2) "fanlan"
3) "fx"
4) "woshifanlan"
127.0.0.1:6379> spop name   #随机删除集合当中的值
"woshifanlan"
127.0.0.1:6379> smembers name   
1) "zfx"
2) "fanlan"
3) "fx"
127.0.0.1:6379> sadd name1 fanlan
(integer) 1
127.0.0.1:6379> smove name name1 fx "   #将一个指定的值,移动到另外一个set集当中
(integer) 1
127.0.0.1:6379> smembers name1  #查看另一个集合已经移入
1) "fanlan"
2) "fx"
127.0.0.1:6379>
数字集合类:
- 差集 sdiff    一般地,设A,B是两个 集合,由所有属于A且不属于B的元素组成的集合,叫做集合A减 集合B( 或 集合A与集合B之差),记作A-B(或A\B),即A-B={x|x∈A,且x B}(或A\B={x |x∈A,且x B}.
- 交集 sinsert
- 并集 sunion
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b c
(integer) 2
127.0.0.1:6379> sadd ket1 b c d
(integer) 3
127.0.0.1:6379> smembers key1
1) "a"
127.0.0.1:6379> smembers ket1
1) "b"
2) "d"
3) "c"
127.0.0.1:6379> smembers key1
1) "b"
2) "c"
3) "a"
127.0.0.1:6379> sdiff key1 ket1     #key1-ket1的差集就是a 
1) "a"
127.0.0.1:6379> sdiff ket1 key1      #ket1-key1的差集就是d
1) "d"
127.0.0.1:6379> sinter key1 ket1    #交集
1) "b"
2) "c"
127.0.0.1:6379> sunion key1 ket1    #并集
1) "b"
2) "d"
3) "a"
4) "c"

微博,A用户将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中!
共同关注,共同爱好,二度好友,推荐好友!(六度分割理论)

Hash(哈希)

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

key-map key-(key value)

127.0.0.1:6379> hset name fanlan fx #设置hset值
(integer) 1
127.0.0.1:6379> hget name fanlan    #获取hset值
"fx"
127.0.0.1:6379> hmset name fanlan zfx fanlan1 woshifanlan    # 设置set多个 key-vlaue
OK
127.0.0.1:6379> hmget name fanlan fanlan1       #获取get多个字段值
1) "zfx"    
2) "woshifanlan"
127.0.0.1:6379> hgetall name    #获取全部数据
1) "fanlan"
2) "zfx"
3) "fanlan1"
4) "woshifanlan"
127.0.0.1:6379>
127.0.0.1:6379> hgetall name    #获取全部hash数据
1) "fanlan"
2) "zfx"
3) "fanlan1"
4) "woshifanlan"
127.0.0.1:6379> hdel name fanlan    #删除指定key的值
(integer) 1
127.0.0.1:6379> hgetall name    #查看之后的hash值
1) "fanlan1"
2) "woshifanlan"
127.0.0.1:6379>
127.0.0.1:6379> hgetall name    #查看hash表的所有值
1) "fanlan1"
2) "woshifanlan"
3) "fanlan"
4) "fx"
5) "fanlan2"
6) "zfx"
127.0.0.1:6379> hlen name   # 获取hash表的字段数量!
(integer) 3
127.0.0.1:6379>
127.0.0.1:6379> hexists name fanlan # 判断hash中指定字段是否存在!1存在
(integer) 1
127.0.0.1:6379> hexists name fn     #0 不存在
(integer) 0
127.0.0.1:6379>
# 只获得所有field
# 只获得所有value

127.0.0.1:6379> hkeys name  #获取所有的fieid
1) "fanlan1"
2) "fanlan"
3) "fanlan2"
127.0.0.1:6379> hvals name  #获取所有的value
1) "woshifanlan"
2) "fx"
3) "zfx"
127.0.0.1:6379>
127.0.0.1:6379> hgetall name #获取所有值
1) "fanlan1"
2) "woshifanlan"
3) "fanlan"
4) "1"
5) "fanlan2"
6) "zfx"
7) "fanlan3"
8) "8"
127.0.0.1:6379> hset name fanlan4 1     #指定初始值
(integer) 1
127.0.0.1:6379> hincrby name fanlan4 2  #指定值+2
(integer) 3
127.0.0.1:6379> hincrby name fanlan4 -1 #指定值-1
(integer) 2
127.0.0.1:6379> hsetnx name fanlan5 hello   # 如果不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx name fanlan5 world   # 如果存在则不能设置
(integer) 0
127.0.0.1:6379>

hash变更的数据 user name age,尤其是是用户信息之类的,经常变动的信息! hash 更适合于对象的
存储,String更加适合字符串存储!

Zset(有序集合)

在set的基础上 set key value ----->zset key score value

127.0.0.1:6379> zadd name 1 fanlan      #添加一个值
(integer) 1
127.0.0.1:6379> zadd name 2 fx 3 woshifanlan    #添加多个值
(integer) 2
127.0.0.1:6379> zrange name 0 -1        #查看有序集合中区间内的所有值
1) "fanlan" 
2) "fx"
3) "woshifanlan"
#有序集合 升序
127.0.0.1:6379> zadd salary 2000 fanlan     #添加三个值
(integer) 1
127.0.0.1:6379> zadd salary 2500 woshifanlan
(integer) 1
127.0.0.1:6379> zadd salary 3000 fx
(integer) 1 
127.0.0.1:6379> zrange salary 0 -1      #查看所有用户
1) "fanlan"
2) "woshifanlan"
3) "fx"
127.0.0.1:6379> zrangebyscore salsry -inf +inf  #查询的是不存在的所以报错
(empty list or set)
127.0.0.1:6379> zrangebyscore salary -inf +inf  #排序从小到大
1) "fanlan"
2) "woshifanlan"
3) "fx"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores   #排序用户工资从小到大(升序)相应的工资与用户
1) "fanlan"
2) "2000"
3) "woshifanlan"
4) "2500"
5) "fx"
6) "3000"
# 有序集合降序
127.0.0.1:6379> zrevrange salary 0 -1       #排序 从大到小  
1) "fx"
2) "woshifanlan"
3) "fanlan"
127.0.0.1:6379> zrevrange salary 0 -1 withscores    ##排序用户工资从大到小(降序)相应的工资与用户
1) "fx"
2) "3000"
3) "woshifanlan"
4) "2500"
5) "fanlan"
6) "2000"
127.0.0.1:6379> zrangebyscore salary -inf 3000 withscores   #用户工资小3000的用户
1) "fanlan"
2) "2000"
3) "woshifanlan"
4) "2500"
5) "fx"
6) "3000"
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores   #用户小于2500的用户
1) "fanlan"
2) "2000"
3) "woshifanlan"
4) "2500"
127.0.0.1:6379>
127.0.0.1:6379> zrangebyscore salary 2000 +inf withscores   #用户大于2000的用户
1) "fanlan"
2) "2000"
3) "woshifanlan"
4) "2500"
5) "fx"
6) "3000"
127.0.0.1:6379>
127.0.0.1:6379> zrange salary 0 -1  #查询zset集合当中所有值
1) "fanlan"
2) "woshifanlan"
3) "fx"
127.0.0.1:6379> zrem salary fx  #移除zset集合当中指定的值
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "fanlan"
2) "woshifanlan"
127.0.0.1:6379> zcard salary    #获取zset集合当中的个类似于len
(integer) 2
127.0.0.1:6379>
127.0.0.1:6379> zadd number 1 fx
(integer) 1
127.0.0.1:6379> zadd number 2 fanlan 3 woshifanlan
(integer) 2
127.0.0.1:6379> zrange number 0 -1 withscores
1) "fx"
2) "1"
3) "fanlan"
4) "2"
5) "woshifanlan"
6) "3"
127.0.0.1:6379> zcount number 0 3       #获取zset集合当中指定区间的成员个数
(integer) 3
127.0.0.1:6379>

案例思路:set 排序 存储班级成绩表,工资表排序!
普通消息,1, 重要消息 2,带权重进行判断!
排行榜应用实现,取Top N 测试

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值