• Redis 字符串( String )


    【一】简介

     String 是 Redis 最基本的数据类型,你可以理解成 Memcache 一模一样的类型,一个 key 对应一个 value 。

     String 类型是二进制安全的。意味着 Redis 的 String 可以包含任何数据。比如 jpg 图片或者序列化对象。

     String 类型是 Redis 最基本的数据类型,一个 Redis 中字符串 value 最多可以是512M。

    【二】常用命令

    1. 127.0.0.1:6379> flushdb
    2. OK

    清空当前的数据库

    1. 127.0.0.1:6379> keys *
    2. (empty array)

    查看一下,当前库里面,什么也没有

    1. 127.0.0.1:6379> set k1 v100
    2. OK
    3. 127.0.0.1:6379> set k2 v200
    4. OK

    往里面加了两个数据

    1. 127.0.0.1:6379> keys *
    2. 1) "k1"
    3. 2) "k2"

    查看一下当前数据库有什么内容

    1. 127.0.0.1:6379> get k1
    2. "v100"

    取 k1 对应的值

    1. 127.0.0.1:6379> set k1 v1100
    2. OK
    3. 127.0.0.1:6379> get k1
    4. "v1100"

    改变 k1 的值,并查看 k1 对应的值是否发生改变

    1. 127.0.0.1:6379> append k1 abc
    2. (integer) 8
    3. 127.0.0.1:6379> get k1
    4. "v1100abc"

    在 k1 的后面接上 abc ,返回 k1 的长度变成了8,取得 k1 的值,确实得到了印证

    1. 127.0.0.1:6379> strlen k1
    2. (integer) 8

    获取 k1 的长度,为8

    1. 127.0.0.1:6379> setnx k2 v2200
    2. (integer) 0
    3. 127.0.0.1:6379> get k2
    4. "v200"
    5. 127.0.0.1:6379> setnx k3 v300
    6. (integer) 1
    7. 127.0.0.1:6379> get k3
    8. "v300"

     setnx k 只在 k 存在的时候才会给 k 赋值,否则不会进行这个操作

    1. 127.0.0.1:6379> set k4 4
    2. OK
    3. 127.0.0.1:6379> incr k4
    4. (integer) 5
    5. 127.0.0.1:6379> get k4
    6. "5"
    7. 127.0.0.1:6379> decr k4
    8. (integer) 4
    9. 127.0.0.1:6379> get k4
    10. "4"
    11. 127.0.0.1:6379> incr k5
    12. (integer) 1
    13. 127.0.0.1:6379> get k5
    14. "1"
    15. 127.0.0.1:6379> decr k5
    16. (integer) 0
    17. 127.0.0.1:6379> decr 5
    18. (integer) -1
    19. 127.0.0.1:6379> decr k6
    20. (integer) -1

     incr k 使存储的数字值增1,只能对数字进行操作,如果为空,新增为1

    decr k 使存储的数字值减1,如果为空,为-1

    补充: incrby / decrby k 2 的意思是将 key 中存储的数字值增减。自定义步长。

    【三】原子性

     INCR key

    起始版本:1.0.0

    时间复杂度: O (1)

    对存储在 key 的数值执行原子的加1操作。

    所谓原子操作是指不会被线程调度机制打断的操作;

    这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)

    (1)在单线程中,能够在单条指令中完成的操作可以认为是“原子操作”, 因为中断只能发生于指令之间。

    (2)在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。

     Redis 单命令的原子性主要得益于 Redis 的单线程。

    案例

     java 中的 i ++ 是否是原子操作?

     i = 0 ;两个线程分别对 i 进行++100次,值是多少?

    不是

    答案不确定,最大值200,最小值是2

    第一个线程跑了99次,然后突然被第二个打断了,第二个取值为1,然后,第一个取值为1,第二个跑完,第一个执行最后一步,2

    【四】 进阶指令

     mset k1 v1 k2 v2 ...

    同时设置一个或多个 key-value 对

     mget k1 k2 ...

    同时获取一个或多个 value

     msetnx k1 v1 k2 v2 ...

    同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在

    因为原子性,有一个失败则都失败

     getrange key  0 3

    获取值得范围,其实就是截串,截取第0位到第3位

    setrange key 2 value

    从 key 的第2位开始,覆盖 key 的值

     setex age 20 value

    设置 age 的值为 value ,过期时间为20秒

     ttl age

    查看 age 距离过期时间还有多少秒

    get name jack

    将 name 的值换成 jack

    【五】数据结构

     String 的数据结构为简单动态字符串( Simple Dynamic String ,缩写 SDS)。是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList ,采用预分配冗余空间的方式来减少内存的频繁分配。

    当字符串的长度小于1 M 时,扩容都是加倍现有的空间,如果超过1 M ,扩容时一次只会多扩容1 M 的空间。需要注意的是字符串的最大长度为512 M 。

  • 相关阅读:
    一级缓存 + ORM + 持久化
    JNI 初级接触
    在PCB走线中线不直,有小疙瘩,让走线变直的方法
    并发编程之深入理解CAS
    带权并查集
    人工智能赋能财务体系架构
    arm设备上的嵌入式开发编译环境搭建
    刷题笔记28——一直分不清的Kruskal、Prim、Dijkstra算法
    linux三剑客之grep
    最新,2022年JCR正式发布(附影响因子名单下载)
  • 原文地址:https://blog.csdn.net/FairyKunKun/article/details/128085907