Redis学习笔记-基本命令

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       # 获取已打卡数,默认为全部天数,可在后面添加起始和终止下标进行计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值