• 从另一个角度谈谈Redis的常用数据结构


    Redis提供了一些数据结构供我们往Redis中存取数据,最常用的的有5种,字符串(String)、哈希(Hash)、列表(list)、集合(set)、有序集合(ZSET)。

    字符串(String)

    字符串类型是Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习奠定基础。字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。

    (虽然Redis是C写的,C里面有字符串<本质使用char数组来实现>,但是处于种种考虑,Redis还是自己实现了字符串类型)

    操作命令

    set 设置值

    set key value

    ​set命令有几个选项:

    ex seconds: 为键设置秒级过期时间。

    px milliseconds: 为键设置毫秒级过期时间。

    nx: 键必须不存在,才可以设置成功,用于添加(分布式锁常用)。

    xx: 与nx相反,键必须存在,才可以设置成功,用于更新。

    从执行效果上看,ex参数和expire命令基本一样。还有一个需要特别注意的地方是如果一个字符串已经设置了过期时间,然后你调用了set 方法修改了它,它的过期时间会消失。

    而nx和xx执行效果如下

    除了set选项,Redis 还提供了setex和 setnx两个命令:

    setex key seconds value

    setnx key value

    setex和 setnx的作用和ex和nx选项是一样的。也就是,setex为键设置秒级过期时间,setnx设置时键必须不存在,才可以设置成功。

    setex示例:

    ​setnx示例:

    ​因为键foo-ex已存在,所以setnx失败,返回结果为0,键foo-ex2不存在,所以setnx成功,返回结果为1。

    有什么应用场景吗?以setnx命令为例子,由于Redis的单线程命令处理机制,如果有多个客户端同时执行setnx key value,根据setnx的特性只有一个客户端能设置成功,setnx可以作为分布式锁的一种实现方案。当然分布式锁没有不是只有一个命令就OK了,其中还有很多的东西要注意,我们后面会用单独的章节来讲述基于Redis的分布式锁。

    get 获取值

    如果要获取的键不存在,则返回nil(空):

    mset 批量设置值

    通过mset命令一次性设置4个键值对

    mget 批量获取值

    ​批量获取了键a、b、c、d的值:

    如果有些键不存在,那么它的值为nil(空),结果是按照传入键的顺序返回。

    批量操作命令可以有效提高效率,假如没有mget这样的命令,要执行n次get命令具体耗时如下:

    n次 get时间=n次网络时间+n次命令时间

    使用mget命令后,要执行n次get命令操作具体耗时如下:

    n次get时间=1次网络时间+n次命令时间

    Redis可以支撑每秒数万的读写操作,但是这指的是Redis服务端的处理能力,对于客户端来说,一次命令除了命令时间还是有网络时间,假设网络时间为1毫秒,命令时间为0.1毫秒(按照每秒处理1万条命令算),那么执行1000次 get命令需要1.1秒(10001+10000.1=1100ms),1次mget命令的需要0.101秒(11+10000.1=101ms)。

    Incr 数字运算

    incr命令用于对值做自增操作,返回结果分为三种情况:

    值不是整数,返回错误。

    值是整数,返回自增后的结果。

    键不存在,按照值为0自增,返回结果为1。

    除了incr命令,Redis提供了decr(自减)、 incrby(自增指定数字)、decrby(自减指定数字)、incrbyfloat(自增浮点数),具体效果请同学们自行尝试。

    append追加指令

    append可以向字符串尾部追加值

    strlen 字符串长度

    返回字符串长度

    注意:每个中文占3个字节

    getset 设置并返回原值

    getset和set一样会设置值,但是不同的是,它同时会返回键原来的值

    setrange 设置指定位置的字符

    下标从0开始计算。

    getrange 截取字符串

    getrange 截取字符串中的一部分,形成一个子串,需要指明开始和结束的偏移量,截取的范围是个闭区间。

  • 相关阅读:
    JIRA 在 2024 年完全停止服务器版本支持
    手刻 Deep Learning -第壹章-PyTorch入门教学-基础概念与再探线性回归
    【JAVA学习笔记】63 -坦克大战1.3-敌方发射子弹,击中坦克消失并爆炸,敌人坦克随机移动,规定范围限制移动
    ios safari 浏览器跳转页面没有自适应
    SD-WAN技术:优化国内外服务器访问的关键
    Shell脚本数组
    【历史上的今天】4 月 28 日:人工智能理论之父出生;大众点评上线;苹果开设 iTunes 音乐商店
    A Philosophy of Software Design读书笔记——定义复杂度
    C++之移动语义
    Java内存模型-Java Memory Model(JMM)-可见性、原子性、有序性
  • 原文地址:https://blog.csdn.net/Java_LingFeng/article/details/127655958