Redis 命令基础版

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: redis 已经是服务端很难舍弃的技术点了,让我们一点儿一点儿的学习并掌握redis 吧

 写在前面

下文中 “#{}” 如同mybatis 中可以进行参数替换的占位符一样,表示我们可以自己发挥的东西。 “#”后内容皆为注释解释

redis 版本 4.x

Key设置过期时间

# 默认是secend 秒 该命令适合为以下所有数据类型设置过期时间。
expire #{key} #{seconds} 
# 查看key的过期时间
ttl #{key}

image.gif

有关过期时间多说两句,redis 会将带有过期时间的key统一维护在一个独立的字典中,与普通的key做区分。

两种过期key 清除方式分别是定时扫描策略及惰性删除:

    1. 定时扫描策略:默认每秒进行10次,随机取出20个,删除其中过期的key,如果过期的key 超过1/4,那就从头再来一遍,为了保证性能扫描循环不会超过25s以防止扫描删除策略过多占用线程。
    2. 惰性删除方式,当client 请求对应的key 时,redis 会校验当前key 是否过期,如果过期直接删除。

    由以上两个删除策略,我们还可以多联想出一些事情,就是为了防止redis 用过多的资源去干删除key 这件事儿,避免很多key 设置相同的过期时间,尽量在一个范围内随机设置过期时间呢。

    基础数据结构

    简介

    众所周知Redis有五种数据结构,string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。

    Redis中所有数据结构都是以唯一的key 字符串作为名称,然后通过这个key 来获取或者设置对应的value,上面提到的数据结构就是指可以支持的value 的结构呢。

    本文呢,着重讲述命令,数据结构的高级介绍会在未来深入研究以后做新的总结。

    string(字符串)

    这个字符串类似于Java中的ArrayList,存在动态扩容的可能,也像是mysql中的varChar

    重要的命令如下:

    # 设置一个key 以及对应的 value,并设置指定的过期时间,此原子操作避免异常状态下出现死锁 
    # 对同一个key 重新使用set命令,会使整个key变成永久有效的存储,需要注意。
    set #{key} #{value} ex #{seconds}  
    # 下面是等同于上面的命令 需要注意的是 value 与过期时间有转换,原子操作。
    setex #{key} #{seconds} #{value}
    # 如果key 存在不执行该命令,key不存在则会创建(key存在 ? 不执行 : 创建)
    setnx #{key} #{value}
    # 获取对应key的value值 
    get #{key}
    # 批量设置string类型的key及value
    mset #{key1} #{value1}  #{key2} #{value2}  #{key2} #{value2}
    # 批量获取key
    mget #{key1} #{key2} #{key3} 
    # 使元素自增1,原子操作,返回自增后的值。
    incr #{key} 
    # 使元素 自增对应的数字,可以用正负数字完成反向操作,原子操作,返回结果。
    incrby #{key} #{num}  
    # 使元素自减1,原子操作,返回自增后的值。
    decr #{key} 
    # 使元素 自减 对应的数字,可以用正负数字完成反向操作,原子操作,返回结果。
    decrby #{key} #{num}  
    # string类型可以当做bitmap使用,没有太理解,就不班门弄斧子了,以后出进阶版的时候加上

    image.gif

    list(列表)

    类似于Java中的LinkedList的结构,是链表而不是数组。对应key 中的元素全部都被移除后,内存会被清空。因为是链表的缘故,很天然的就可以用来当做栈或者队列

    常用命令如下:

    FIFO 队列


    clipboard.pngimage.gif

    image.gif

    # FIFO 队列操作 入队,其实就是从右面放入元素 其中r指的是右
    rpush #{key} #{value1} #{value2} #{value3}
    # 查看列表的长度
    llen #{key} 
    # 出队,从左面拿出来一个数据,也就是从左面拿出来一个元素,按照上面的存入顺序,出来的就是 value1,每出一个队列中元素就减1
    lpop #{key}

    image.gif

    FILO 栈

    1604746981(1).png

    image.gif

    # FILO 栈操作 入栈,其实就是从右面放入元素 其中r指的是右
    rpush #{key} #{value1} #{value2} #{value3}
    # 查看列表的长度
    llen #{key} 
    # 出栈,从列表右侧拿出一个元素,按照上面的存入顺序,出来的就是 value3,每出一个队列中元素就减1
    rpop #{key}
    # 接下来不再是队列栈的操作了,而是对列表的操作,上面的也是基于列表的特性抽象出来的骚操作罢了
    # 从start 遍历到stop ,0,-1 就是全遍历  O(n) 复杂度
    lrange #{key} #{start} #{stop}
    # 获取指定索引的value O(n) 复杂度
    lindex #{key} #{index}
    # 对指定范围的索引数据进行截取保存 
    ltrim #{key} #{start} #{stop}

    image.gif

    hash(字典)

    类似于Java中的HashMap 的数据结构,是数组与链表形式的二维结构。

    可以用hash存储一个bean值,这样不必json序列化整个对象存在string结构中,使用还是要结合实际场景,因为hash结构的存储占用的空间比较大。

    # 指定一个为key的hash结构的数据,并存储其中的键值对。
    hset #{key} #{field}  #{value} 
    # 获取对应key中field的value
    hget #{key} #{field}
     # hash 中的某个field 的 value 进行加法 加 num 跟string 的incrby 一样
     hincrby #{key} #{field} #{num}
    # 获取key 下 所有的 field 与 value 结果
    hgetall #{key} 
    # 获取key 下 field与value成对的数量
    hlen #{key} 
    # 批量设置 key 下的 field 及 value
    hmset #{key} #{field1} #{value1} #{field2} #{value2} #{field3} #{value3}
    # 批量获取 key 下的 field 的 value 按照输入顺序展示
    hmget #{key} #{field1}  #{field3} #{field2} 
    # 删除指定key下的field 及 value 可批量删除
    hdel #{key} #{field1}  #{field3} #{field2}

    image.gif

    set

    类似Java中的HashSet 的数据结构。。。value无序且唯一哦

    # 给key 添加一个或者多个值
    sadd #{key} #{value1} #{value2} 
    # 判断当前set中是否包含value
    sismember #{key} #{value}
    # 遍历当前key下的所有set的内容
    smembers #{key}
    # 获取当前key 下的set 存储的元素个数
    scard #{key}
    # 弹出一个key 对应set 中的一个或者count个元素 count可以不写 不写默认一个 随机弹出哦
    spop #{key} #{count}

    image.gif

    zset

    类似Java中的TreeSet但是又真的很不像,像是带有排序功能的Map,底层数据结构是skipList,很有意思,很值得说。也是面试的时候高频的问题,可以拓展也可以等我继续分享哦。

    # 为key 对应的zset 添加一个member 及对应的score 的权重值 或者多个这样的组合, 
    zadd #{key} #{score} #{member} #{score1} #{member1} #{score2} #{member2}
    # 对key 对应的zset 从start 到stop 范围内的元素排序输出 升序
    zrange #{key} #{start} #{stop}
    # 对key 对应的zset 从start 到stop 范围内的元素排序输出 降序
    zrevrange #{key} #{start} #{stop}
    # 获取key 对应的zset 中的元素个数
    zcard #{key}
    # 获取指定 key 下的指定member 的score 其中score 是double 类型值
    zscore #{key} #{member} 
    # 将指定key 下的zset 按照分值的区间 min 到max 进行排序,还能像mysql 那样进行分页查询
    zrangebyscore #{key} #{min} #{max} 
    # 删除指定的key 下的指定元素 可批量删除
    zrem #{key} #{member} #{member}

    image.gif

    以上这些内容皆为redis 中比较常用的命令,多知道点儿也是好事儿。大家加油~~~

    相关实践学习
    基于Redis实现在线游戏积分排行榜
    本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
    云数据库 Redis 版使用教程
    云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
    相关文章
    |
    8天前
    |
    NoSQL Java Redis
    redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
    这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
    18 1
    redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
    |
    2天前
    |
    缓存 NoSQL 测试技术
    Redis如何解决频繁的命令往返造成的性能瓶颈!
    Redis如何解决频繁的命令往返造成的性能瓶颈!
    |
    7天前
    |
    缓存 NoSQL Redis
    Redis命令:列表模糊删除详解
    Redis命令:列表模糊删除详解
    16 3
    |
    9天前
    |
    NoSQL 关系型数据库 MySQL
    Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
    本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
    51 0
    Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
    |
    27天前
    |
    监控 NoSQL Redis
    redis-server --service-install redis.windows.conf --loglevel verbose 命令的作用是什么?
    redis-server --service-install redis.windows.conf --loglevel verbose 命令的作用是什么?
    34 3
    |
    18天前
    |
    存储 缓存 NoSQL
    Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
    Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
    35 0
    |
    2月前
    |
    存储 消息中间件 NoSQL
    Redis命令详解以及存储原理
    Redis命令详解以及存储原理
    |
    3月前
    |
    存储 缓存 NoSQL
    Redis 全局通用命令整理
    Redis 全局通用命令整理
    62 10
    |
    2月前
    |
    SQL 缓存 NoSQL
    【Azure Redis 缓存】使用Azure Redis服务时候,如突然遇见异常,遇见命令Timeout performing SET xxxxxx等情况,如何第一时间查看是否有Failover存在呢?
    【Azure Redis 缓存】使用Azure Redis服务时候,如突然遇见异常,遇见命令Timeout performing SET xxxxxx等情况,如何第一时间查看是否有Failover存在呢?
    |
    2月前
    |
    缓存 监控 NoSQL
    【Azure Redis 缓存】Azure Redis出现了超时问题后,记录一步一步的排查出异常的客户端连接和所执行命令的步骤
    【Azure Redis 缓存】Azure Redis出现了超时问题后,记录一步一步的排查出异常的客户端连接和所执行命令的步骤