Redis学习之Redis五大基本数据类型

12 篇文章 0 订阅

Redis五大数据类型

redis五大数据类型 String、list、set、hash、zset的常用api演示

Redis-Key(关于key的命令)

# set key value 设置值
# get key 获取值
# keys * 查看所有的key
# exist key 判断当前key是否存在
# expire key 10 设置过期时间(秒)
# ttl key 查看剩余过期时间
# del key 删除key 
# move key 1 (将这个key移动到1号数据库中)
# type key (查看key的类型)


127.0.0.1:6379> keys * # 查看所有的key
(empty list or set)
127.0.0.1:6379> set name pihao #set key
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set age 24
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> EXISTS name #判断当前key是否存在
(integer) 1
127.0.0.1:6379> EXISTS gender
(integer) 0
127.0.0.1:6379> get name # 获得key的值
"pihao"
127.0.0.1:6379> EXPIRE age 10 # 为key设置过期时间
(integer) 1
127.0.0.1:6379> TTL age # 查看key剩余过期时间
(integer) 4
127.0.0.1:6379> get age
(nil)
127.0.0.1:6379> type name # 查看代码
string

后面如果遇到,查看官网的帮助文档

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C4r1LKgk-1593937010507)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200704210709558.png)]

String(字符串)

90%的java程序员使用redis只会一个String类型!

# set key value 设置值
# keys * 
# exists key
# append key value 追加字符串(如果key不存在时则相当于set key)
# strlen key 查看key字符串的长度
# incr key 自加1(只针对数字类型的字符串)
# decr  key 自减1
# incrby key count (每次自加count)
# decrby key count (每次自减count)
# getrange key index1 index2 (截取key的值[index1,index2] 闭区间)
# setrange key index value (替换,将key的值从index的索引处开始用value来替换)
# setex key count value   ([set with expire] 设置key的值并附带过期时间)
# setnx key value   ([set if not exist] 如果key不存在则设置)在分布式锁中会经常使用
# mset k1 v1 k2 v2 (批量设置值)
# mget k1 k2 (批量获取值)
# getset (先获取再设置值) 有点像java的CAS比较并交换

#############################################################################################################################
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> APPEND k1 hello
(integer) 7
127.0.0.1:6379> get k1
"v1hello"
127.0.0.1:6379> STRLEN k1
(integer) 7
127.0.0.1:6379> APPEND k1 pihao
(integer) 12
127.0.0.1:6379> STRLEN k1
(integer) 12
127.0.0.1:6379> get k1
"v1hellopihao"
#############################################################################################################################

127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> incr views # incr 加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 # decr 减1
(integer) 1
127.0.0.1:6379> incrby views 10 # 步长
(integer) 11
127.0.0.1:6379> decrby views 20
(integer) -9
127.0.0.1:6379>
#############################################################################################################################
# 字符串范围
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set key hello,pihao
OK
127.0.0.1:6379> get key
"hello,pihao"
127.0.0.1:6379> GETRANGE key 0,4 # 截取字符串[0,4]闭区间
(error) ERR wrong number of arguments for 'getrange' command
127.0.0.1:6379> GETRANGE key 0 4
"hello"
127.0.0.1:6379> GETRANGE key 0 -1 #获取全部字符串
"hello,pihao"
127.0.0.1:6379>

#替换
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 zz #从b后面开始替换
(integer) 7
127.0.0.1:6379> get key2
"azzdefg"
127.0.0.1:6379>
#############################################################################################################################
# setex(set with expire) # 设置过期时间
127.0.0.1:6379> SETEX key3 20 pihao # 
OK
127.0.0.1:6379> ttl key3
(integer) 17
127.0.0.1:6379> get key3
"pihao"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379>

# setnx(set if not exist) # 不存在则设置
127.0.0.1:6379> SETNX mykey redis
(integer) 1
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379> SETNX mykey java # 如果key不存在则设置
(integer) 0
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379>

#############################################################################################################################
# mset 
# mget 
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 # 批量设置
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
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 # 如果不存在则创建,是一个原子性的操作(要么一起成功要么一起失败)
(integer) 0
127.0.0.1:6379>

# 对象 
set user:1 {name:zhangsan,age:23} # 设置一个user:1 对象,值为json字符串来保存一个对象
# 这里的key是一个很巧妙的设计:user:{id}:{field},如此设计在Redis中是完全OK的
127.0.0.1:6379> mset user:1:name pihao user:1:age 2
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "pihao"
2) "2"
127.0.0.1:6379>
#############################################################################################################################
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 mongodb # 如果存在值,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"
127.0.0.1:6379>

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

  • 计数器
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存存储

List

在redis里面,我们把list可以当做是栈、队列、阻塞队列!
所有的list命令都是l开头的

#############################################################################################################################
# lpush key value ..将一个值或者多个值,插入到列表的头部,从左边插入(双端队列)
# rpush key value .. 将一个值或者多个值,插入到列表的尾部,从右边插入
# range key index1 index2 取值[闭区间]
# lpop 从左边移除一个值
# rpop 从右边移除一个值
# lindex key index 从左边开始(通过下标获取值)
# llen key (获取某个列表的长度)
# lrem key count value 移除count个指定的value值 
# ltrim key index1 index2 截取指定的长度
# rpoplpush source key  移除列表的最后一个元素并将其添加到另外一个列表
# lset key index value 将列表中指定的下标的值替换成另外一个值,更新操作
# linsert key before|after pivot value将某一个具体的value插入到列表中某个元素的前面或者后面!

#############################################################################################################################
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
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"
127.0.0.1:6379>
#############################################################################################################################
# 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
"three"
127.0.0.1:6379> rpop list
"right"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379>

#############################################################################################################################
# 获取某个索引处的值
# lindex key index 从左边取

127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 0
"two"
127.0.0.1:6379>

#############################################################################################################################
# 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
127.0.0.1:6379>
#############################################################################################################################
# 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 # (移除一个one)
(integer) 1
127.0.0.1:6379> lrange list 0 -1 
1) "three"
2) "three"
3) "two"
127.0.0.1:6379>
#############################################################################################################################
# ltrim 截取指定的长度
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"
127.0.0.1:6379>

#############################################################################################################################
# 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 otherlist # 移除最后一个元素,并将其添加到otherlist这个列表中
"hello2"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange otherlist 0 -1
1) "hello2"
127.0.0.1:6379>

#############################################################################################################################
# lset key index value 将列表中指定的下标的值替换成另外一个值,更新操作
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 # 如果list这个key不存在则会报错
OK
127.0.0.1:6379> lrange list 0 0 
1) "item"
127.0.0.1:6379> lset list 1 pihao # 如果该下标处没有值则会报错
(error) ERR index out of range
127.0.0.1:6379>
#############################################################################################################################
# linsert key before|after pivot value将某一个具体的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 pihao # 在world的前面插入
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "pihao"
3) "world"
127.0.0.1:6379> linsert mylist after world new # 在world的后面插入
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "pihao"
3) "world"
4) "new"
127.0.0.1:6379>

小结

  • 它实际上是一个链表,before Node after,left ,right 都快要插入
  • 如果key不存在就创建新的链表
  • 如果key存在就新增内容
  • 如果移除了所有的值,空链表,也代表不存在
  • 在两边插入或者改动值效率最高!中间元素,相对来说效率会低一点

扩展:可用于做消息队列或者栈:

消息队列(先进先出):lpush rpop

栈(先进后出):lpush lpop

Set(集合)

set中的值是不能重复的

#############################################################################################################################
# sadd key value # 往set集合中添加元素
# smembers key # 查看set集合中的所有元素
# sismember key value # 判断value是否在set的集合中
# scard key # 获取set集合中的元素的个数
# srem key value # 移除set集合中指定的元素
# srandmember key count 从set集合中随机获取
# spop key 随机删除set集合中的一些元素
# smove source destination member  将一个指定的值移动到另外一个set集合
# sdiff key1 key2 求差集,以key1为基础,找出key1中与key2中不同的元素
# sinter key1 key2 求交集,找出key1与key2的交集
# sunion key1 key2 求并集,找出key1与key2的并集


#############################################################################################################################
127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset pihao
(integer) 1
127.0.0.1:6379> sadd myset love
(integer) 1
127.0.0.1:6379> smembers myset
1) "pihao"
2) "love"
3) "hello"
127.0.0.1:6379> sismember myset pihao # 判断是否在集合中
(integer) 1
127.0.0.1:6379> sismember myset world
(integer) 0
127.0.0.1:6379>
#############################################################################################################################
127.0.0.1:6379> scard myset # 获取set集合中的元素的个数
(integer) 3
127.0.0.1:6379> srem myset nihao # 移除set集合中指定的元素
(integer) 1
127.0.0.1:6379> scard myset
(integer) 3
127.0.0.1:6379> smembers myset
1) "pihao"
2) "love"
3) "hello"
127.0.0.1:6379>
#############################################################################################################################
# srandmember key count 从set集合中随机获取
127.0.0.1:6379> SMEMBERS myset
1) "pihao"
2) "love"
3) "hello"
127.0.0.1:6379> SRANDMEMBER myset#随机取出1个元素
"hello"
127.0.0.1:6379> SRANDMEMBER myset
"pihao"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "love"
2) "hello"
127.0.0.1:6379> SRANDMEMBER myset 2 # 随机取出2个元素
1) "pihao"
2) "hello"
#############################################################################################################################
# spop 随机删除set集合中的一些元素
127.0.0.1:6379> SMEMBERS myset
1) "pihao"
2) "love"
3) "hello"
127.0.0.1:6379> spop myset
"hello"
127.0.0.1:6379> spop myset
"love"
127.0.0.1:6379> SMEMBERS myset
1) "pihao"
127.0.0.1:6379>
#############################################################################################################################
# smove 将一个指定的值移动到另外一个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> SMEMBERS myset
1) "world"
2) "hello"
127.0.0.1:6379> smove myset myset2 hello # 将集合中的hello元素移动到另外一个集合中
(integer) 1
127.0.0.1:6379> SMEMBERS myset # 原来的集合中就没有这个元素了
1) "world"
127.0.0.1:6379> SMEMBERS myset2 # 另一个集合中就增加了这个元素
1) "hello"
127.0.0.1:6379>
#############################################################################################################################
# 交集、并集、差集
# sdiff 差集
# sinter 交集
# sunion 并集

127.0.0.1:6379> sadd set1 a
(integer) 1
127.0.0.1:6379> sadd set1 b
(integer) 1
127.0.0.1:6379> sadd set1 c
(integer) 1
127.0.0.1:6379> sadd set2 b
(integer) 1
127.0.0.1:6379> sadd set2 c
(integer) 1
127.0.0.1:6379> sadd set2 d
(integer) 1
127.0.0.1:6379> SDIFF set1 set2 # 注意这里是以set1为基础,查看set1中与set2的差异
1) "a"
127.0.0.1:6379> SINTER set1 set2 # 求交集
1) "c"
2) "b"
127.0.0.1:6379> SUNION set1 set2# 求并集
1) "b"
2) "c"
3) "a"
4) "d"
127.0.0.1:6379>

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

Hash(哈希)

Map集合,key-Map集合!(key key value),本质和String类型没有太大区别,还是一个简单的key-value

#############################################################################################################################
# hset key field value 设置值
# hget key field 获取值
# hmset key field1 value1 field2 value2...设置多个值
# hmget key field1 field2... 获取多个值
# hgetall key 获得所有的hash ,以key value的形式
# hdel key field1 field2 ... 删除指定的一个或者多个字段,对应的value也就没有了
# hlen  获取hash中键值对的对数,也就是hash表的字段数量
# hexists key field  判断hash中某个字段field是否存在
# hkeys key 获取hash中所有的field字段
# hvals key 获取hash中所有的value值
# hincrby key field count 增加count,count为负值就是减
# hsetnx key field value # 如果字段不存在则设置(可用于分布式锁)

#############################################################################################################################
127.0.0.1:6379> hset myhash name pihao
(integer) 1
127.0.0.1:6379> hget myhash name
"pihao"
127.0.0.1:6379> hmset myhash age 24 gender male
OK
127.0.0.1:6379> hmget myhash name age gender# 获取多个字段的值
1) "pihao"
2) "24"
3) "male"
127.0.0.1:6379> hset myhash name haozi # 如果key存在的话则赋值失败,不能够覆盖。
(integer) 0
127.0.0.1:6379> hgetall myhash # 获取所有的hash数据
1) "name"
2) "haozi"
3) "age"
4) "24"
5) "gender"
6) "male"
127.0.0.1:6379>
#############################################################################################################################
# 删除字段
127.0.0.1:6379> hgetall myhash
1) "name"
2) "haozi"
3) "age"
4) "24"
5) "gender"
6) "male" 
127.0.0.1:6379> hdel myhash age gender # 可以删除一个字段也可以删除多个字段
(integer) 2
127.0.0.1:6379> hgetall myhash
1) "name"
2) "haozi"
127.0.0.1:6379>
#############################################################################################################################
# hlen  获取hash中键值对的对数
127.0.0.1:6379> hgetall myhash
1) "name"
2) "pihao"
3) "age"
4) "24"
127.0.0.1:6379> hlen myhash
(integer) 2
127.0.0.1:6379> hexists myhash name # 判断hash中某个字段是否存在
(integer) 1
127.0.0.1:6379> hexists myhash gender
(integer) 0
127.0.0.1:6379>
#############################################################################################################################
# 只获得所有的field字段
# 只获取所有的value值
127.0.0.1:6379> hkeys myhash
1) "name"
2) "age"
127.0.0.1:6379> hvals myhash
1) "pihao"
2) "24"
127.0.0.1:6379>
#############################################################################################################################
# hincr 增加
127.0.0.1:6379> hget myhash age
"24"
127.0.0.1:6379> hincrby myhash age 2
(integer) 26
127.0.0.1:6379> hincrby myhash age -1
(integer) 25
127.0.0.1:6379> hsetnx myhash height 168 # hsetnx如果没有则设置
(integer) 1
127.0.0.1:6379> hsetnx myhash height 170 # 存在的话就不能赋值
(integer) 0
127.0.0.1:6379>

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

Zset(有序集合)

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

#############################################################################################################################
# zadd key score value 往set集合中添加值
# zrange key index1 index2 获取指定的位置的值
# zrangebyscore key -inf +inf  # 负无穷到正无穷排序,从小到大
# zrangebyscore key -inf +inf withscores #带score的从小到大排序
# zrerange key 0 -1 withscores # 降序排序
# zrem key value # 移除一个元素
# zcard salary # 查看zset的大小
# zcount key val1 val2 # 查看指定区间内的数量



#############################################################################################################################
127.0.0.1:6379> zadd myset 1 one
(integer) 1
127.0.0.1:6379> zadd myset 2 two
(integer) 1
127.0.0.1:6379> zadd myset 3 three
(integer) 1
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 pihao
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf  # 负无穷到正无穷排序,从小到大
1) "pihao"
2) "xiaohong"
3) "zhangsan"

127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores # 显示所有的用户带成绩
1) "pihao"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"
127.0.0.1:6379> ZREVRANGE salary 0 -1 withscores # 降序排序
1) "zhangsan"
2) "5000"
3) "pihao"
4) "500"
127.0.0.1:6379>

#############################################################################################################################
127.0.0.1:6379> zrem salary xiaohong # 移除一个元素
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores
1) "pihao"
2) "500"
3) "zhangsan"
4) "5000"
127.0.0.1:6379> zcard salary # 查看zset的大小
(integer) 2
127.0.0.1:6379> zadd name 10 xiaoming 20 xiaohua 30 pihao 
(integer) 3
127.0.0.1:6379> zcount name 0 25 # 统计区间内的个数
(integer) 2
127.0.0.1:6379> zcount name 21 31
(integer) 1
127.0.0.1:6379>

案例思路:set排序,存储班级成绩表,工资表排序!
普通消息1,重要消息2,带权重进行判断,排行榜应用实现,取top10
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值