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和自减1 | incr [key] ;decr [key] (increase; decrement) |
加上/减去指定值(加一个by即可) | incrby [key] [number] ; decrby [key] |
批量设置key-value; | mset [key1 val1 key2 val2 key3 val3…] |
批量获取value | mget[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
- “jinchange”
- “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