Redis自学二(五大基本数据类型)

Redis的五大数据类型

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

Redis-Key

keys *  #查看所有的key
flushdb   #清空当前数据库,
flushall  #清空所有数据库
exists key #判断值是否存在
move name 1 #移动key为name到数据库1
expire name 10 #设置key为name的值10s后过期
ttl name  #查看当前key剩余秒数
type name #查看当前key为name的值类型
append key1 "hello" #追加
strlen key1 # 查看key为key1的长度

string

set key1 v1 #设置值
get key1 #获得值
append key1 "hello" #追加,如果key不存在,相当于set key
strlen key1 # 查看key为key1的长度
incr views # 自加1
decr views # 自减1
incrby views 10 # 自加10,步长为10
decrby views 10 # 自减10,步长为10
getrange key1 0 3 # 查看字符串范围 0到3(包括3)
getrange key1 0 -1 # 查看字符串全部范围
setrange key1 3 xxx # 替换指定位置3的字符串
setex #(set with expire) 设置过期时间
setex key3 30 "hello"
setnx #(set if not exist)    不存在再设置
setnx mykey "redis"
mset k1 v1 k2 v2 k3 v3  # 批量设置值
mget k1 k2 k3     # 批量获取值
msetnx k1 v1 k4 v4 # 当不存在时批量设置值 msetnx是一个原子性的操作,要么一起成功,要么一起失败

对象
set user:1 {name:zhangsan,age:3}
批量设置对象
这里的key是一个巧妙的设计:user:{id}:{filed},如此设计可以极大的提升复用率
mset user:2:name lisi user:2:age 21
OK
mget user:2:name user:2:age
1) "lisi"
2) "21"
getset key1 redis #先获取,再设置,如果不存在返回nil,设置新值,如果存在,替换原来的值

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

  • 计数器
  • 统计多单位的数量

list

基本的数据类型,列表
在redis中,可以设计成栈,队列,阻塞队列
所有的list命令都是l开头的,并且获取命令都是默认先进后出原则

127.0.0.1:6379> LPUSH list1 one
(integer) 1
127.0.0.1:6379> LPUSH list1 two
(integer) 2
127.0.0.1:6379> LPUSH list1 three
(integer) 3
127.0.0.1:6379> LRANGE list1 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LRANGE list1 0 1
1) "three"
2) "two"
127.0.0.1:6379> RPUSH list2 one
(integer) 1
127.0.0.1:6379> RPUSH list2 two
(integer) 2
127.0.0.1:6379> RPUSH list2 three
(integer) 3
127.0.0.1:6379> LRANGE list2 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> LRANGE list2 0 1
1) "one"
2) "two"
#lpop 默认弹出左边第一个元素,rpop默认弹出右边第一个元素
127.0.0.1:6379> LRANGE list1 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LPOP list1
"three"
127.0.0.1:6379> RPOP list2
"three"
#lindex 通过下标获取值
127.0.0.1:6379> LINDEX list1 0
"two"
127.0.0.1:6379>
#llen 获取keylist的长度
127.0.0.1:6379> LLEN list1
(integer) 2
 精确移除list1中的一个值:one,精度匹配
127.0.0.1:6379> LREM list1 1 one
(integer) 1
127.0.0.1:6379> LRANGE list1 0 -1
1) "two"
#通过下标截取指定下标的list操作,截取后只剩下截取后的结果
ltrim mylist 1 2
#弹出一个值到另一个列表中
lpoplpush mylist myotherlist # 移除列表的最后一个元素,将他移动到新的列表中
#lset更新操作,目标元素要先存在,否则失败
lset list 0 item
 linsert 列表插入操作
linsert mylist before "world" "other"
127.0.0.1:6379> LRANGE list1 0 -1
1) "three"
2) "one"
3) "two"
127.0.0.1:6379> LINSERT list1 before one onebefore
(integer) 4
127.0.0.1:6379> LRANGE list1 0 -1
1) "three"
2) "onebefore"
3) "one"
4) "two"

小结

list实际上是一个链表,before node after,left,right 都可以插入值
如果key不存在,创建新的链表
如果key存在,新增内容
如果移除了所有值,空链表,也代表不存在!
在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点
消息队列,栈的实现

set

set中的值是不能重复的!
所有set命的值都是s开头的

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 #查看set 集合中添加的值
1) "world"
2) "hello"
127.0.0.1:6379> SISMEMBER myset hello # 判断set 集合中的值是否存在
(integer) 1
127.0.0.1:6379> SCARD myset # 查看集合中有多少元素
(integer) 
127.0.0.1:6379> SREM myset hello # 移除指定的一个集合元素
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "world"
#set无序不重复集合,抽随机
127.0.0.1:6379> SMEMBERS myset
1) "test3"
2) "test2"
3) "test4"
4) "world"
5) "test1"
127.0.0.1:6379> SRANDMEMBER myset # 随机抽取一个集合中的元素
"test4"
127.0.0.1:6379> SRANDMEMBER myset 1
1) "test4"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "test2"
2) "test4"
#随机删除指定的key
127.0.0.1:6379> SPOP myset
"test2"
127.0.0.1:6379> SMEMBERS myset
1) "test3"
2) "test4"
3) "world"
4) "test1"
127.0.0.1:6379> SPOP myset 2
1) "test1"
2) "test3"
#将一个指定的值,移动到另一个set集合中
127.0.0.1:6379> SMEMBERS myset
1) "test5"
2) "test6"
3) "test4"
4) "world"
127.0.0.1:6379> SMOVE myset myset2 world
(integer) 1
127.0.0.1:6379> SMEMBERS myset2
1) "world"
2) "t1"


#共同关注 (并集)
#数字集合类:
- 差集
- 交集
- 并集
#查看差集
127.0.0.1:6379> sadd skey1 a
(integer) 1
127.0.0.1:6379> sadd skey1 b
(integer) 1
127.0.0.1:6379> sadd skey1 v
(integer) 1
127.0.0.1:6379> sadd skey2 v
(integer) 1
127.0.0.1:6379> sadd skey2 c
(integer) 1
127.0.0.1:6379> sadd skey2 d
(integer) 1
127.0.0.1:6379> SDIFF skey1 skey2
1) "b"
2) "a"
#查看交集
127.0.0.1:6379> SINTER skey1 skey2
1) "v"
#查看并集
127.0.0.1:6379> SUNION skey1 skey2
1) "v"
2) "b"
3) "a"
4) "d"
5) "c"
微博,A用户将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中!共同关注,共同爱好,二度好友,推荐好友(六度分割理论)

hash

map集合,key-map,这时候值是一个map集合,本质上和string类型没有太大区别,还是一个简单的key-vlaue,类型变成是hash
set myhash field value

#设置一个hash值
127.0.0.1:6379> HSET myhash field1 testhash
(integer) 1
127.0.0.1:6379> HGET myhash field1
"testhash"
#设置多个hash值,当key重复时会覆盖原来的内容
127.0.0.1:6379> hmset myhash field1 hello field2 world
OK
127.0.0.1:6379> hmget myhash field1 field2
1) "hello"
2) "world"
#删除指定字段内容
127.0.0.1:6379> hmset myhash1 test1 111 test2 222
OK
127.0.0.1:6379> get myhash1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> hmget myhash1 test1 test2
1) "111"
2) "222"
127.0.0.1:6379> hdel myhash1 test1
(integer) 1
127.0.0.1:6379> hmget myhash1 test1 test2
1) (nil)
2) "222"
#获取所有hash字段
127.0.0.1:6379> hgetall myhash1
1) "test2"
2) "222"
#获取hash内容长度
127.0.0.1:6379> hlen myhash1
(integer) 1
#判断hash字段是否存在
127.0.0.1:6379> hexists myhash1 test2
(integer) 1
127.0.0.1:6379> hexists myhash1 test3
(integer) 0
#获取所有hash key或者value
127.0.0.1:6379> hkeys myhash
1) "field1"
2) "field2"
127.0.0.1:6379> hvals myhash
1) "hello"
2) "world"
127.0.0.1:6379> hset myhash field3 5
(integer) 1
#给hash某个字段指定增量
127.0.0.1:6379> hincrby myhash field3 1
(integer) 6
#给hash某个字段指定减量
127.0.0.1:6379> hincrby myhash field3 -1
(integer) 5
#判断hash某个字段是否存在,不存在则可以设置,存在则不可以设置(应用分布式锁)
127.0.0.1:6379> hsetnx myhash field4 hello
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 world
(integer) 0
hash变更的数据user name age,尤其是用户信息之类的,经常变动的信息!hash更适合对象的存储

zset

有序集合
在set的基础上,增加了一个值,对比:sadd myset hello,zadd myzset 1 hello
所有zset的命令都是以z开头的

#设置一个有序集合一个值
127.0.0.1:6379> zadd myzset 1 one
(integer) 1
127.0.0.1:6379> zadd myzset 2 two 3 three
(integer) 2
#获取有序集合
127.0.0.1:6379> ZRANGE myzset 1 -1
1) "two"
2) "three"
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379>
#排序
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 xiaoming
(integer) 1
#升序排序 从小到大
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf
1) "xiaoming"
2) "xiaohong"
3) "zhangsan"
#升序排序带参数
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores
1) "xiaoming"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"
#从负无穷到2500进行排序并且附带参数
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores
1) "xiaoming"
2) "500"
3) "xiaohong"
4) "2500"
#降序排序,从大到小
127.0.0.1:6379> ZREVRANGE salary 0 -1
1) "zhangsan"
2) "xiaohong"
127.0.0.1:6379> ZREVRANGE salary 0 -1 withscores
1) "zhangsan"
2) "5000"
3) "xiaohong"
4) "2500"
#zrem移除元素
127.0.0.1:6379> ZRANGE salary 0 -1
1) "xiaoming"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrem salary xiaoming
(integer) 1
127.0.0.1:6379> ZRANGE salary 0 -1
1) "xiaohong"
2) "zhangsan"
#获取有序集合中的个数
127.0.0.1:6379> zcard salary
(integer) 2
#获取集合不同区间中的个数
127.0.0.1:6379> zcount myzset 1 2
(integer) 2
127.0.0.1:6379> zcount myzset 1 2
(integer) 2
127.0.0.1:6379> zcount myzset 1 3
(integer) 3
127.0.0.1:6379> zcount myzset 1 4
(integer) 3
127.0.0.1:6379> zcount myzset 0 4
(integer) 3

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值