Redis学习笔记-基本命令
五大数据类型
Redis-Key
EXISTS keyname # 查看是否存在名为keyname的键
move keyname 1 # 移除当前数据库下名为keyname的键
EXPIRE keyname 10 # 设置该键的过期时间为10s
ttl keyname # 查看该key剩余时间
type keyname # 查看该key是什么类型
String
keys * # 获取全部的key
append keyname "str" # 在该键的值后追加字符串,如果该键不存在,则相当于set
strlen keyname # 获取该键的值的长度
incr keyname # 使得键值+1
decr keyname # 使得键值-1
incrby keyname 10 # 使得键值+10
decrby keyname 10 # 使得键值-10
getrange keyname 0 1 # 获取键值从第0个开始截取到第1个
getrange keyname 0 -1 # 获取所有的字符串
setrange keyname 1 xx # 替换指定位置开始的字符串
setex (set with expire) # 设置过期时间
setnx (set if not exist) # 不存在时设置 (在分布式锁中经常使用),若存在则设置失败
mset k1 v1 k2 v2 # 批量设置
mget k1 k2 # 批量获取值
msetnx k1 v1 k2 v2 # 当不存在时批量设置,只要有一个存在,全部都设置失败(原子性操作)
# 对象
set user:1 {name:alb,age:3} # 设置一个user:1 对象 值为json字符串来保存一个对象
# 也可以利用mset: user:{id}:{field}
mset user:1:name alb user:1:age 18
mget user:1:name user:1:age
getset key value # 先获取再设置值,若没有该键,则创建一个
String 类似的使用场景:value除了是字符串还可以是数字
- 计数器
- 统计多单位的数量
- 对象缓存存储
- 粉丝数
- …
List
基本的数据类型,列表
在Redis中,可以用List实现栈、队列、阻塞队列等
所有的List命令都是以l(L)开头的,Redis不区分大小写
lpush listname value # 将一个或多个值插入到列表头部(左)
lrange listname 0 -1 # 获取list区间内的值,0 -1即全部
rpush listname value # 将一个或多个值插入到列表尾部
lpop listname # 移除列表左端第一个值
rpop listname # 移除列表右端第一个值
lindex listname # 通过下标获取list中的指定位置的值
llen listname # 获取list的长度
lrem listname 2 v1 # 移除列表中指定个数的指定值(移除几个)
ltrim listname 0 2 # 列表中从下标为0处开始截取,截取至下标为2处
rpoplpush list1 list2 # 移除list1中最后一个元素并将其移动至list2中
lset listname 0 value # 将列表中指定下标的值设置其值为value,但如果没有该列表或者列表中指定下标不存在则报错
linsert list before|after v1 value # 在值为v1的前/后插入一个value
Set(集合)
set中的值是无序、不可重复的
sadd set1 value # 在set1中添加一个value,若set不存在则为新建一个set并添加
smembers set1 # 查看set1下所有的成员
sismember set1 value # 查看value是否为set1的成员,如果是则返回1,否则返回0
scard set1 # 获取set1中元素的个数
srem set1 value # 移除set1中的指定元素
srandmember set1 # 随机获取set1中的元素,如果后面添加了数字,即为随机获取set1指定个数的元素
spop set1 # 随机移除set1中的元素(也可指定个数)
smove set1 set2 value # 将指定元素从set1中移动到set2中
sdiff set1 set2 # 查看set1中与set2不同的元素,谁在前就查看谁的
sinter set1 set2 # 查看set1与set2的交集
sunion set1 set2 # 查看set1与set2的并集
Hash
Map集合,也即key-Map(Key-<key,value>),此时的值为一个Map集合
hset hash1 f1 v1 # 设置hash1中的以键为f1,值为v1的键值对
hget hash1 f1 # 获取hash1中键为f1的值
hmset hash1 f1 v1 f2 v2 # 同时设置多个键值对
hmget hash1 f1 f2 f3 # 同时获取多个键值对
hgetall hash1 # 获取所有的键值对,显示方式为上面为键,下面为值
hdel hash1 f1 # 删除指定的键,对应的value也被删除
hlen hash1 # 获取hash1中键的个数
hkeys hash1 # 只获得所有的键
hvals hash1 # 只获得所有的值
hincrby hash1 f1 1 # 将hash1中键为f1的值加1
hdecrby hash1 f1 1 # 将hash1中键为f1的值减1
hsetnx hash1 f1 v1 # 若不存在则创建
hash 可用来存放变更的数据,尤其是用户信息之类的,经常变动的信息
hash更适合于对象的存储,String更适合字符串的存储
Zset
在set的基础上增加了一个值
zadd zset1 1 one # 添加一个值,中间的值为score
zadd zset1 2 t 3 th # 添加多个值
zrange zset1 0 -1 # 获取zset1中的所有值,按score升序显示
zrevrange salary 0 -1 # 获取zset1中的所有值,按score降序显示
zadd salary 100 A 600 B 1500 C 2000 D 2500 E # 添加薪水信息,此时score为薪水值
zrangebyscore salary -inf +inf # 将salary中的值以score从负无穷到正无穷按升序输出
zrangebyscore salary -inf +inf withscores # 输出的时候携带对应score值
zrangebyscore salary -inf 2500 # 升序显示工资不大于2500的值
zrevrangescore salary +inf -inf # 将salary中的值以score从正无穷到负无穷按降序输出
zrem salary A # 移除A元素
zcard salary # 获取有序集合中的个数
zcount salary 100 300 # 获取指定区间的成员数量
案例思路:存储班级成绩表、工资表排序
- 普通消息:1、重要消息:2 带权重进行判断
- 排行榜应用实现,取Top N
三大特殊类型
geospatial(地理位置)
朋友的定位、附近的人、打车距离计算等
Redis的Geo在Redis 3.2版本就推出了,此功能可以推算地理位置的信息,两地之间的距离,方圆半径内的人等
# 只有6个命令
geoadd
geodist
geohash
geopos
georadius
georadiusbymember
-
geoadd
# 有效的经度从-180度到180度。 # 有效的纬度从-85.05112878度到85.05112878度。 # 当坐标位置超出上述指定范围时,该命令将会返回一个错误。 # 两级无法直接添加 # 参数: key 值(纬度、经度、名称) geoadd China:City 1 1 xx geoadd China:City 113.28 23.12 guangzhou geoadd China:City 114.08 22.54 shenzhen 121.47 31.23 shanghai
-
geopos
获取当前定位:一定是一个坐标值
geopos China:City guangzhou # 获取某个城市的经纬度 geopos China:City guangzhou shanghai # 获取多个城市的经纬度
-
geodist
返回两个给定位置之间的距离
指定单位的参数unit必须是以下单位的其中一个:
- m 表示单位为米
- km 表示单位为千米
- mi 表示单位为英里
- ft 表示单位为英尺
如果没有显式地指定单位参数,那么默认使用米作为单位
geodist China:City guangzhou shenzhen km # 返回广州深圳的直线距离,单位为km
-
georadius
以给定的经度纬度为中心,找出某一半径内的元素
找附近的人(获得所有附近的人的定位),通过半径来查询
georadius China:City 110 30 1000 km # 以经度为110 纬度为30作为圆心搜索以1000km为半径的键中的元素 georadius China:City 110 30 1000 km withdist # 带上与其的直线距离 georadius China:City 110 30 1000 km withcoord # 带上元素的经度纬度 georadius China:City 110 30 1000 km count 1 # 限定显示一个元素(直线距离最近的)
-
georadiusbymember
找出位于指定范围内的元素,中心点是由给定的位置元素决定
georadiusbymember China:City guangzhou 1000km # 找出以广州坐标为中心直线距离在半径为1000km内的元素
-
geohash
返回一个或多个位置元素的geohash表示
# 将一个二维的经纬度转换成一维的字符串,如果两个字符串越接近,那么则距离越近 geohash China:City guangzhou shanghai # 返回广州和上海的11个字符的geohash字符串
-
geospatial 底层的实现其实就是一个zset,那么也即我们可以通过zset来操作我们的geo
zrange China:City 0 -1 # 查看China:City下的所有元素 zrem China:City hangzhou # 移除地图中指定的元素
Hyperloglogs
Hyperloglogs是一种概率数据结构,用于计算唯一的事物(从技术上讲,这是指估计集合的基数)
优点:占用的内存是固定的,2^64 不同的元素的计数,只需要12kB内存
A{1,3,5,7,8,7}
B{1,3,5,7,8}
基数(不重复的元素) = 5,可以接收误差
在Redis 2.8.9 版本更新了Hyperloglogs数据结构
网站的UV(一个人访问该网站多次但还是只能算作一次)
传统的方式是使用set保存用户的ID,统计Set中的元素数量作为判断标准
这个方式如果保存大量的ID就会比较麻烦,我们的目的是为了计数而不是保存ID
pfadd key v1 v2 v3 # 创建一组元素
pfcount key # 统计key中元素基数的数量
pfadd key2 v2 v3 v4 v5
pfmerge key3 key key2 # 合并key和key2并存放至key3处
如果允许一定的容错,那么一定可以使用Hyperloglogs
Bitmap
位存储
统计用户信息如登录、未登录;打卡等只有两个状态的,都可以使用Bitmaps
是操作二进制位来进行记录,就只有0和1两个状态
# 记录一周是否打卡
setbit sign 0 1 # 记录第一天已打卡,1表示已打卡
getbit sign 0 # 获取第一天是否打卡
bitcount sign # 获取已打卡数,默认为全部天数,可在后面添加起始和终止下标进行计算