• redis -- 基本介绍 -- 字符串、列表、集合、有序集合、哈希


    Redis

    Redis(Remote Dictionary Server)是一个开源的、高性能的、内存中的数据存储系统

    他可以用作数据库缓存和消息队列等各种场景

    是目前最热门的NoSQL数据库之一

    MySQL的磁盘IO读写速度与内存相比非常慢,在访问量非常大的情况下会遭遇性能瓶颈。如果能够把数据存储在内存中就可以大大提高性能,于是就有了Redis。
    Redis主要将数据存储在RAM(随机存取内存)中,这使得读写操作非常快速。但如果需要,它也提供了将数据持久化到磁盘的选项

    数据类型: 字符串String、列表List、集合Set、有序集合SortedSet、哈希Hash;消息流Stream、地理空间Geospatial、HyperLogLog、位图Bitmap、位域Bitfield

    三种使用方式:
    CLI(Command Line Interface) 命令行
    API(Application Programming Interface) 应用程序接口,即用python等其他语言通过编写代码的方式来使用redis
    CLI(Graphical User Interface) 图形用户界面

    Redis优势:
    性能高
    数据类型丰富,单键值对最大支持512M大小的数据
    简单易用,支持所有主流编程语言
    支持数据持久化、主从复制、哨兵模式等高可用特性

    生存时间(TTL):
    TTL(Time To Live)可以为键设置生存时间,数据将在一定时间后自动过期。这个特性通常在缓存场景中使用

    Linux安装Redis首先需要安装epel源

    yum install epel-release -y
    yum install redis -y
    
    • 1
    • 2

    启动服务:

    服务端
    redis-server
    客户端
    redis-cli
    
    • 1
    • 2
    • 3
    • 4

    退出:

    quit
    
    • 1

    图形化界面工具:RedisInsight

    字符串string

    使用 set 命令来设置一个键值对,在命令行输入set之后,就会有相关提示

    使用 get 命令获取某个键对应的值

    使用 del 删除键值对

    使用 exists 命令来查看键值对是否存在,若存在返回值为1,不存在返回值为0

    使用 keys 命令查看数据库中有哪些键

    使用 flushall 删除所有的键值对

    使用 clear 清空屏幕

    使用 ttl 来查看键值对的过期时间,如果显示 -1 表示没有设置过期时间,如果显示 -2 表示已经过期了

    使用 expire 命令设置过期时间,单位为秒

    使用 setex 设置一个带有过期时间的键值对

    使用 setnx 只有当键值不存在时才会设置键的值,如果键已经存在,不做任何操作

    使用 append 在值的末尾追加

    使用 strlen 获取字符串长度

    使用 mset 一次性设置多个键值对,使用 mget 一次性获取多个键的值

    使用 incrdecr 命令来某个键的值进行递增或递减操作,前提是字符串值必须表示一个整数

    redis的键值对区分大小写

    redis默认使用字符串来存储数据

    redis对于键值对的存储是二进制存储的

    进入redis客户端时接 --raw 参数表示以原始的形式来显示内容

    # 创建一个键值对
    not connected> set name chen
    OK
    # 获取这个键的值
    127.0.0.1:6379> get name
    "chen"
    # 键值对区分大小写
    127.0.0.1:6379> set Name Chen
    OK
    127.0.0.1:6379> get Name
    "Chen"
    127.0.0.1:6379> set age 18
    OK
    127.0.0.1:6379> get age
    "18"
    # 删除键值对
    127.0.0.1:6379> del name
    (integer) 1
    127.0.0.1:6379> get name
    (nil)
    # 判断一个键值对是否存在
    127.0.0.1:6379> exists name
    (integer) 0
    127.0.0.1:6379> exists Name
    (integer) 1
    # 查看所有键值对
    127.0.0.1:6379> keys *
    1) "age"
    2) "Name"
    # 字符串存储一般是二进制形式
    127.0.0.1:6379> set name 陈
    OK
    127.0.0.1:6379> get name
    "\xe9\x99\x88"
    127.0.0.1:6379> quit
    # 接 --raw 表示按原来的形式显示,而非二进制
    [root@localhost ~]# redis-cli --raw
    127.0.0.1:6379> get name
    陈
    # 查看键值对过期时间,-1 表示没有设置时间
    127.0.0.1:6379> ttl name
    -1
    # 设置键值对的过期时间为10s
    127.0.0.1:6379> expire name 10
    1
    127.0.0.1:6379> ttl name
    8
    127.0.0.1:6379> ttl name
    2
    # -2 表示已过期
    127.0.0.1:6379> ttl name
    -2
    127.0.0.1:6379> exists name
    0
    # 设置一个带有过期时间的键值对
    127.0.0.1:6379> setex name 5 陈
    OK
    127.0.0.1:6379> ttl name
    3
    127.0.0.1:6379> ttl name
    -2
    127.0.0.1:6379> set name chen
    OK
    # 在字符串末尾添加
    127.0.0.1:6379> append name 22
    6
    127.0.0.1:6379> get name
    chen22
    # 查看某个键对应的值的长度
    127.0.0.1:6379> strlen name
    6
    127.0.0.1:6379> get age
    18
    # 对整数值进行自增操作
    127.0.0.1:6379> incr age
    19
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    列表list

    列表中的元素是有序、可重复的

    使用 lpush 在列表左侧插入元素,使用 rpush 在列表右侧插入元素

    使用 lrange 命令按范围获取列表中的元素,从而实现分页和遍历

    使用 lpop 从列表左侧删除元素,使用 rpop 从列表右侧删除元素

    使用 ltrim 删除指定范围之外的元素(只保留范围之内的元素)

    使用 llen 获取列表长度

    使用 lindex 获取指定下标的元素

    # 从左插入列表元素
    127.0.0.1:6379> lpush lst1 a b
    2
    # 获取列表所有元素
    127.0.0.1:6379> lrange lst1 0 -1
    b
    a
    127.0.0.1:6379> lpush lst2 aaa
    1
    127.0.0.1:6379> lrange lst2 0 -1
    aaa
    127.0.0.1:6379> lpush ll a b c d
    4
    127.0.0.1:6379> lrange ll 0 -1
    d
    c
    b
    a
    # 从左弹出元素
    127.0.0.1:6379> lpop ll 
    d
    127.0.0.1:6379> lrange ll 0 -1
    c
    b
    a
    # 从右插入元素
    127.0.0.1:6379> rpush ll e
    4
    127.0.0.1:6379> lrange ll 0 -1
    c
    b
    a
    e
    # 缩短列表为指定下标之间的元素
    127.0.0.1:6379> ltrim ll 1 2
    OK
    127.0.0.1:6379> lrange ll 0 -1
    b
    a
    # 查看列表长度(元素个数)
    127.0.0.1:6379> llen ll
    2
    # 查看指定下标的元素
    127.0.0.1:6379> lindex ll 1
    a
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    列表的阻塞操作

    阻塞操作是指在执行操作时,如果条件不满足,客户端会进入等待状态,直到条件满足或超时才会继续执行

    • BLPOP:阻塞左侧弹出。当指定的列表为空时,BLPOP会阻塞客户端,直到列表中有元素出现或超时
    • BRPOP:阻塞右侧弹出。与BLPOP类似,但是从列表右侧弹出元素

    这些阻塞操作通常用于实现队列模型,多个客户端可以在一个队列上等待任务的到来,而不需要轮询检查队列是否为空

    集合set

    set中的元素是无序且不重复的

    使用 sadd 向集合中添加元素,添加失败返回0

    使用 smenbers 获取集合中的所有元素

    使用 sismember 检查一个元素是否存在于集合中,如果存在则返回1,不存在返回0

    使用 srem 删除集合中的元素

    使用 sinter 计算多个集合的交集,使用 sunion 计算多个集合的并集,使用 sdiff 计算多个集合的差集

    使用 scard 获取集合的大小(元素数量)

    使用 srandmember 随机获取集合中的一个或多个元素

    使用 smove 将一个元素从一个集合移动到另一个集合

    # 向集合里添加元素
    127.0.0.1:6379> sadd s1 a b c
    3
    # 查看集合里的所有元素
    127.0.0.1:6379> smembers s1
    c
    b
    a
    # 集合中的元素是不重复的
    127.0.0.1:6379> sadd s1 a
    0
    127.0.0.1:6379> smembers s1
    c
    b
    a
    # 检查元素a是否在集合中
    127.0.0.1:6379> sismember s1 a
    1
    127.0.0.1:6379> sismember s1 d
    0
    # 删除元素a
    127.0.0.1:6379> srem s1 a
    1
    127.0.0.1:6379> smembers s1
    c
    b
    127.0.0.1:6379> sadd s2 b c d
    3
    # s1和s2的交集
    127.0.0.1:6379> sinter s1 s2
    c
    b
    # s1和s2的并集
    127.0.0.1:6379> sunion s1 s2
    d
    b
    c
    # s1与s2的差集
    127.0.0.1:6379> sdiff s1 s2
    
    # s2与s1的差集
    127.0.0.1:6379> sdiff s2 s1
    d
    # 集合的大小(元素个数)
    127.0.0.1:6379> scard s1
    2
    # 随机获取集合中的元素
    127.0.0.1:6379> srandmember s1 1
    c
    127.0.0.1:6379> srandmember s1 1
    c
    127.0.0.1:6379> srandmember s1 1
    b
    # 把集合s2中的元素d移到s1中
    127.0.0.1:6379> smove s2 s1 d
    1
    127.0.0.1:6379> smembers s1
    d
    c
    b
    127.0.0.1:6379> smembers s2
    c
    b
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    有序集合sorted set

    与普通集合不同,有序集合中的每个元素都关联着一个分数(score),分数可以是任何浮点数值,默认按照分数从小到大排序

    有序集合是唯一的,但分数是可以重复的。如果多个元素具有相同的分数,则按照成员的字典顺序排序

    使用 zadd 向有序集合中添加一个元素

    使用 zrange 按排名获取有序集合中的成员

    使用 zscore 查看指定成员的分数

    使用 zrank 查看指定成员的排名(返回下标值),使用 zrevrank 逆序排序

    使用 zrem 删除一个或多个成员

    使用 zincrby 为指定成员增加或减少分数

    使用 zcard 获取有序集合的大小(成员数量)

    使用 zrangebyscore 按分数范围获取成员,使用 zrevrangebyscore 逆序排序

    # 向有序集合中添加成员,注明成员分数
    127.0.0.1:6379> zadd score 85 zhang 60 li 90 wang 77 chen
    4
    # 按排名获取有序集合中的成员
    127.0.0.1:6379> zrange score 0 -1
    li
    chen
    zhang
    wang
    127.0.0.1:6379> zrange score 0 -1 withscores
    li
    60
    chen
    77
    zhang
    85
    wang
    90
    # 查看指定成员分数
    127.0.0.1:6379> zscore score chen
    77
    # 查看指定成员的排名(返回下标值)
    127.0.0.1:6379> zrank score chen
    1
    127.0.0.1:6379> zrevrank score chen
    2
    # 删除一个成员
    127.0.0.1:6379> zrem score chen
    1
    127.0.0.1:6379> zrange score 0 -1
    li
    zhang
    wang
    # 修改指定成员的分数
    127.0.0.1:6379> zincrby score 10 li
    70
    127.0.0.1:6379> zincrby score 10 li
    80
    127.0.0.1:6379> zincrby score -10 li
    70
    127.0.0.1:6379> zcard score
    3
    # 按分数范围获取成员
    127.0.0.1:6379> zrangebyscore score 70 80 withscores
    li
    70
    127.0.0.1:6379> 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    哈希hash

    哈希,是一个字符类型的字段和值的映射表,简单来说就是一个键值对的集合

    redis允许在hash中嵌套另一个hash

    使用 hset 向hash中添加一个键值对,使用 hmset 设置多个键值对

    使用 hget 获取hash中的某个键值对,使用 hmget 获取多个键值对,使用 hgetall 获取一个hash中的所有键值对

    使用 hdel 删除hash中的某个键值对

    使用 hexists 判断某个键值对是否存在,若存在则返回1,不存在返回0

    使用 hkeys 获取hash中的所有key值,使用 hvals 获取hash中的所有value值

    使用 hlen 获取hash中键值对的数量

    # 向hash中添加一个键值对
    127.0.0.1:6379> hset chen age 18
    1
    127.0.0.1:6379> hset chen sex female
    1
    127.0.0.1:6379> hget chen age
    18
    # 获取所有键值对
    127.0.0.1:6379> hgetall chen
    age
    18
    sex
    female
    # 删除键值对
    127.0.0.1:6379> hdel chen sex
    1
    127.0.0.1:6379> hgetall chen
    age
    18
    # 判断键值对是否存在
    127.0.0.1:6379> hexists chen age
    1
    127.0.0.1:6379> hexists chen sex
    0
    # 查看所有的键
    127.0.0.1:6379> hkeys chen
    age
    # 查看所有的值
    127.0.0.1:6379> hvals chen
    18
    # 查看键值对个数
    127.0.0.1:6379> hlen chen
    1
    127.0.0.1:6379> 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
  • 相关阅读:
    HTML+CSS个人静态网页设计
    用Bosch Sensortec的BMI08X传感器API在C语言中控制IMU传感器:一个完整的集成指南
    C++ 多线程 condition变量
    JavaScript之数组常用API
    若依(RuoYi )权限管理设计
    QT线程的使用 QtConcurrent
    算法自学__树的重心
    介绍Node.js+Electron框架下和常用(HID 串口 BLE)硬件通信方法
    HTML+CSS大作业 格林蛋糕(7个页面) 餐饮美食网页设计与实现
    Canny算子与霍夫变换检测圆与直线
  • 原文地址:https://blog.csdn.net/qq_45742976/article/details/132912013