1-Redis八种数据结构学习总结


Redis操作入门

1. 基础知识和指令

Redis 默认有16个数据库(0-15), 可通过配置文件进行配置, 默认端口6379

中文网: https://www.redis.net.cn

Redis是单线程的为什么还那么快?

Redis主要是内存操作, 因此CPU并不是Redis的性能瓶颈, 同时单线程还能避免线程上下文切换带来的性能损耗.

Redis的数据类型:

  • 五大基础类型:Stirng,List,Set,Zset,Hash
  • 三大特殊类型:geospatial(地理空间),Hyperloglog,Bitmap
指令作用
select 1选择一号数据库
flushdb清空当前数据库数据
flushall清空所有数据
set name jinchange设置一个key-value数据
get name根据key获取数据
del [name]删除name属性
keys *查看当前所有key
exists [name]判断某key是否存在
move [name] 1一处1号数据库中key为1的数据
expire [name] 10让key为name的字段10秒后过期
ttl [name]查看name字段的过期时间
type [name]查看name的类型

2. 基本类型

2.1 String 字符串类型

2.1.1 类型说明,应用场景

关于Redis中的String

  • Stirng最大存储量 512MB
  • 使用String存储对象信息object:objid:arg
    mset user:1:name jinchange user:1:age 18 user:1:sex man
    mget user:1:name user:1:age user:1:sex

2.2.2 String常用指令

  • 增删:get,set,del
  • 子串操作:strlen,append,getrange,setrange
  • 条件操作(时间,是否不存在):setex,setnx
  • 数学操作:incr ,decr;incrby,decrby
  • 批量操作:mset,mget,msetnx
  • 复合操作:getset
作用指令
设置值set [key] [value]
获取值get [key]
删除值del [key]
追加字符串,不存在则自动创建append [key] [value]
获取字符串长度strlen [key] [number]
获得子串(开始0 , 结尾-1)getrange [key] [start] [end]
替换某位置开始的子串setrange [key] [index] [value]
设置值, 同时设置过期时间setex [key] [time] [value]
当key不存在时再定义key, 已存在则定义失败setnx [key] [value]
自增1和自减1incr [key] ;decr [key] (increase; decrement)
加上/减去指定值(加一个by即可)incrby [key] [number] ; decrby [key]
批量设置key-value;mset [key1 val1 key2 val2 key3 val3…]
批量获取valuemget[key1 key2 key3]
批量先判断不存在才会设置; 注意: 该操作是原子性的, 如果有一个设置失败全都失败, 要么一起成功,要么一起失败msetnx [key1 val1 key2 val2…]
先获取再设置值, 若不存在则返回null, 若存在则先返回旧的值再设置新的值getset [key] [value]

3.1 List 列表类型

3.1.1 类型说明,应用场景

  • Redis中的List数据结构是非常骚的数据结构,它不仅仅可以当list使用,还能当Stack,Queue使用
  • List的所有命令基本上都是L开头的

3.2.2 常用指令

作用指令
向一个list左部添加一个元素lpush [listName] [value]
向一个list右部添加一个元素rpush [listName] [value]
获取list的所有值lrange [listName] [start] [end]
从左边取出lsit的一个元素lpop [listName]
从右边取出list的一个元素rpop [listName]
获取list长度llen [listName]
获取指定位置元素lindex [listName] [index]
删除指定数目的某个值lrem [listName] [count] [value]
列表修剪; 注意是清除掉[start, end]之外的值ltrim [listName] [start] [end]
右部pop一个元素加入到另一个list中rpoplpush [list1] [list2]
判断lsit是否存在exists [listName]
将指定下标的值进行修改; 前提是该下标已经有值lset [listName] [index] [newValue]
在指定值之前/之后插入值linsert [listName] [before | after] [item] [TargetValue]

4.1Set 无序集合类型

4.1.1 类型说明,应用场景

  • set是一个无序集合, 不能存储相同的数据
  • 操作set的指令大多是以s头(sxxx)
  • 交集,并集,差集可以求共同好友,不同好友,所有好友

4.2.2 Set常用指令

####################################### 常用操作
sadd set 1 #元素添加
(integer) 1

sismember set 1 #判断元素是否存在集合中
(integer) 1

scard set #获取元素个数
(integer) 1

sadd set 1 2 3 4 5 #批量添加
(integer) 5

srandmember set 1 #随机获取一个元素
1) "4"

spop set 1 #随机移除一个元素
1) "2"

####################################### 集合运算
sadd set1 1 2 3 4 5
sadd set2 4 5 6 7 8

sdiff set1 set2 #差集
1) "1"
2) "2"
3) "3"

sinter set1 set2 #交集
1) "4"
2) "5"

sunion set1 set2 #并集
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"

5.1 Hash 哈希类型

5.1.1 类型说明,应用场景

  • 操作hash的指令大都是以h开头的
  • 存储对象信息

hmset user:1 name jinchange age 18
OK
hmget user:1 name age

  1. “jinchange”
  2. “18”

5.2.2 常用指令

####################################### 设置,获取,批量操作,删除操作
> hset hash k1 v1 # 设置值
(integer) 1

> hget hash k1 # 获取值
"v1"

> hmset hash k1 v11 k2 v2 k3 v3 # 批量设置
OK

> hmget hash k1 k2 k3 # 批量获取
1) "v11"
2) "v2"
3) "v3"

> hgetall hash # 获取hash所有数据
1) "k1"
2) "v11"
3) "k2"
4) "v2"
5) "k3"
6) "v3"

> hdel hash k1 # 根据key删除某个value
(integer) 1

#######################################  判断key是否存在,单独获取所有key,valu
> hexists hash k2 #key是否存在
(integer) 1

> hkeys hash #获取所有key
1) "k1"
2) "k2"
3) "k3"

> hvals hash #获取所有val
1) "v1"
2) "v2"
3) "v3"

#######################################  同一指令value自增,自减; 不存在则创建,存在则失败
> hincrby hash k4 1 #增量设置为1则自增1
(integer) 101

> hincrby hash k4 -1 #增量设置为-1则自减1
(integer) 100

> hsetnx hash k5 168 # 不存在就创建
(integer) 1
> hsetnx hash k5 100
(integer) 0

6.1 ZSet 有序集合类型

6.1.1 类型说明,应用场景

  • 数据格式:有序集合名 排序权重 对应值
  • 排行榜
  • 消息顶置,联系人顶置

6.2.2 常用指令

#######################################  
> zadd price 1 egg #天意一个元素到有序集合中
(integer) 1

> zadd price 3 cake 100 tea #添加多个
(integer) 2

> zrange price 0 -1 # 展示所有有序集合的值(不管顺序)
1) "egg"
2) "cake"
3) "tea"

> zrangebyscore price -inf +inf # 从小到大对有序集合的值进行排序;注意只能从小到大,可以选择区间显示
1) "egg"
2) "cake"
3) "tea"
 
> zrangebyscore price 1 5 # 从小到大并只要 [1, 5] 区间内的值
1) "egg"
2) "cake"

> zrangebyscore price -inf +inf withscores # 将权重也显示出来
1) "egg"
2) "1"
3) "cake"
4) "3"
5) "tea"
6) "100"

> zrem price tea # 移除某个值
(integer) 1

> zcard price # 判断有序集合中有多少个元素
(integer) 2


> zrevrange price 0 -1 # 从高到低获取有序集合中的所有元素
1) "hotdog"
2) "cake"
3) "egg"

> zrevrange price 0 -1 withscores # 从高到低获取有序集合中的所有元素,并获得权重
1) "hotdog"
2) "5"
3) "cake"
4) "3"
5) "egg"
6) "1"

> zcount price 1 5 # 统计权重在[1, 5]之间的元素值
(integer) 3

2. 特殊数据类型

2.1 GeoSpatial 地理空间

2.1.1 类型说明,应用场景

  • 操作地理空间的指令大多是geo开头的:geoXXX
  • geospatial是基于Zset实现的因此可以使用zset的指令对此类型数据进行操作
  • 直线距离
  • 范围内的城市,朋友

2.1.2 常用指令

> geoadd city 113.2 23.1 guangzhou 116.4 39.9 beijing # 添加某地的经度纬度
(integer) 2

> geopos city beijing  # 查询城市经纬度
1) 1) "116.39999896287918"
   2) "39.900000091670925"
   
> geodist city beijing shanghai km # 获取两点之间的直线距离
"1067.7424"
 
> georadius city 120 30 1200 km # 查找坐标为 120,30的1200km内的城市名
1) "guangzhou"
2) "shanghai"
3) "beijing"

> georadius city 120 30 1200 km withcoord withdist count 2 # 同时显示直线距离,经纬度,并只显示两个
1) 1) "shanghai"
   2) "189.1500"
   3) 1) "121.40000134706497"
      2) "31.200000614837059"
2) 1) "guangzhou"
   2) "1022.5850"
   3) 1) "113.20000022649765"
      2) "23.100000053072641"
      
      
# geo radius by member 以成员为中心点指定半径进行查找
> georadiusbymember city shanghai 1500 km
1) "guangzhou"
2) "shanghai"
3) "beijing"

# 将二维经度转换为一维哈希字符串(会造成精度损失)
> geohash city beijing guangzhou
1) "wx4fbxxfke0"
2) "ws07rvjxr00"

# 使用zset指令操作geospatial   遍历 + 移除
> zrange city 0 -1
1) "guangzhou"
2) "shanghai"
3) "beijing"
> zrem city shanghai
(integer) 1

2.2 Hyperloglog 类型

2.2.1 类型说明,应用场景

  • 基数统计

  • 用来做数据统计的数据结构

  • 特点:不管存放多少最多只需要12kb的内存,有0.81%的错误率(好奇这种算法怎么实现?)

  • 适用于:可以容错的业务场景(网站访问量数据统计);要求不允许容错则使用set

  • 指令以pf开头;pfxxx

  • 引用自官网:

    • 您不再需要使用与计数的项目数量成正比的内存量,而是可以使用恒定量的内存!最坏情况下为 12k 字节

    • 统计网站访问量,同时对内存有很高要求,对精度的要求不高

2.2.2 常用指令

> pfadd hll 1 2 3 4 5 6 6 7 7 # pfadd 添加元素到hyperloglog中
(integer) 1
> pfcount hll # 统计hyperloglog中有多少个不重复元素
(integer) 7
> pfadd hll2 2 3 4 5 6 7 8 9
(integer) 1
> pfcount hll2
(integer) 8
> pfmerge hll3 hll hll2 #将两个hyperloglog合并为一个,求并集
OK
> pfcount hll3
(integer) 9

2.3 Bitmap

2.3.1 类型说明,应用场景

  • 位图,位存储,所有操作都是基于二进制位进行操作,节省内存
  • 状态记录,打开,未打卡;登录,未登录;活跃,不活跃

2.3.2 常用指令

################################ 设置 周一到周日打开情况 setbit key index status
> setbit status 0 1  
(integer) 0
> setbit status 1 1
(integer) 0
> setbit status 2 1
(integer) 0
> setbit status 3 1
(integer) 0
> setbit status 4 1
(integer) 0
> setbit status 5 1
(integer) 0
> setbit status 6 0
(integer) 0
> setbit status 7 0
(integer) 0

> getbit status 6 # 获取某天的打卡情况
(integer) 0

> bitcount status # 统计该数据结构中状态为1的数量(可指定范围 0 -1)
(integer) 6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值