• Redis学习


    Redis学习

    1.简介

    Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

    Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。

    Redis 与其他 key - value 缓存产品有以下三个特点:

    • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
    • Redis支持数据的备份,即master-slave模式的数据备份。

    Redis的优势:

    • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
    • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
    • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
    • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。#

    2.Redis配置

    详情见:https://www.runoob.com/redis/redis-conf.html

    3.Redis数据类型

    String类型

    string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB

    Redis中只能存字符串,数字也是字符串的形式保存的

    127.0.0.1:6379> set ceshistring "hello world"
    OK
    127.0.0.1:6379> get ceshistring
    hello world
    1.将给定 key 的值设为 value ,并返回 key 的旧值(old value)127.0.0.1:6379> getset ceshi "helloday"
    helloworld   
    2.获取所有(一个或多个)给定 key 的值。
    127.0.0.1:6379> mget ceshi ceshi1  
    helloday   
    123
    3.将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)127.0.0.1:6379> setex ceshi 3 "helloworld"
    OK         
    4.只有在 key 不存在时设置 key 的值。
    127.0.0.1:6379> setnx ceshi "123"
    1
    127.0.0.1:6379> get ceshi
    123
    127.0.0.1:6379> setnx ceshi "000"
    0
    127.0.0.1:6379> get ceshi
    123
    127.0.0.1:6379>
    5.返回 key 所储存的字符串值的长度。
    127.0.0.1:6379> strlen ceshi
    3
    6.同时设置一个或多个 key-value 对。
    127.0.0.1:6379> mset ceshi1 "ceshi1" ceshi2 "ceshi2"
    OK
    127.0.0.1:6379> get ceshi1
    ceshi1
    127.0.0.1:6379> get ceshi2
    ceshi2
    127.0.0.1:6379>
    7.同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
    127.0.0.1:6379> msetnx ceshi1 "ceshi" ceshi3 "ceshi3"
    0
    127.0.0.1:6379> get ceshi1
    ceshi1
    127.0.0.1:6379> get ceshi3
    发现key为ceshi3没有值,遵循了redis的原子性,要么成功要么失败
    8.和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
    127.0.0.1:6379> psetex ceshi0 3000 "hello world"
    OK
    9.将 key 中储存的数字值增一。
    127.0.0.1:6379> get ceshi
    10
    127.0.0.1:6379> incr ceshi
    11
    127.0.0.1:6379> get ceshi
    11
    10.将 key 中储存的数字值减一。
    127.0.0.1:6379> decr ceshi
    10
    11.key 所储存的值减去给定的减量值(decrement)  当key不存在,会直接默认为0进行删除
    127.0.0.1:6379> get ceshi0
    ceshi0为空
    127.0.0.1:6379> decrby ceshi0 10
    -10
    127.0.0.1:6379> get ceshi0
    -10
    12.将 key 所储存的值加上给定的浮点增量值
    127.0.0.1:6379> get ceshi0
    -10
    127.0.0.1:6379> incrby ceshi0 20
    10
    127.0.0.1:6379> get ceshi0
    10
    13.如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。
    127.0.0.1:6379> get ceshi
    10
    127.0.0.1:6379> append ceshi "你好中国"
    10
    127.0.0.1:6379> get ceshi
    10你好中国
    
    • 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
    hash(哈希)类型

    每个 hash 可以存储 232 -1 键值对(40多亿)

    1.查看哈希表 key 中,指定的字段是否存在。
    127.0.0.1:6379> hexists ceshi key1
    1
    2.获取存储在哈希表中指定字段的值。
    127.0.0.1:6379> hget ceshi key1
    value1
    3.获取在哈希表中指定 key 的所有字段和值
    127.0.0.1:6379> hgetall ceshi
    key1
    value1
    key2
    value2
    4.为哈希表 key 中的指定字段的整数值加上增量 increment 。
    127.0.0.1:6379> hincrby ceshi key4 100
    102
    5.获取哈希表中字段的数量
    127.0.0.1:6379> hlen ceshi
    5
    6.同时将多个 field-value (域-值)对设置到哈希表 key 中。
    127.0.0.1:6379> hmset ceshi key1 "value1" key2 "value2" key3 "value3"
    OK
    127.0.0.1:6379> hgetall ceshi
    key1
    value1
    key2
    value2
    key3
    value3
    7.获取哈希表中所有值。
    127.0.0.1:6379> hvals ceshi
    value1
    value2
    value3
    8.迭代哈希表中的键值对。
    HSCAN key cursor [MATCH pattern] [COUNT count]
    --cursor - 游标。
    --pattern - 匹配的模式。
    --count - 指定从数据集里返回多少元素,默认值为 10 。
    注:后面的match是匹配的Redis中的键
    
    127.0.0.1:6379> hscan ceshi 0 match "key1*"
    0
    key1
    value1
    
    • 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
    List列表 (可以重复)

    Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

    1.移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
    127.0.0.1:6379> blpop ceshi 10
    ceshi
    value1
    2.移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
    BRPOP key1 [key2 ] timeout
    3.通过索引获取列表中的元素
    LINDEX key index
    4.在列表的元素前或者后插入元素
    LINSERT mylist BEFORE "World" "There"
    5.获取列表长度
    LLEN key
    6.移出并获取列表的第一个元素
    LPOP key
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    Set集合和有序集合

    Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

    集合对象的编码可以是 intset 或者 hashtable。

    Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

    1.向集合添加一个或多个成员
    127.0.0.1:6379> sadd ceshi value1 value2 value3
    3
    2.获取集合的成员数
    127.0.0.1:6379> scard ceshi
    3
    3.返回第一个集合与其他集合之间的差异
    127.0.0.1:6379> smembers ceshi
    value1
    value3
    value2
    127.0.0.1:6379> smembers ceshi1
    value1
    value2
    127.0.0.1:6379> sdiff ceshi ceshi1
    value3
    4.返回给定所有集合的差集并存储在 destination 中
    127.0.0.1:6379> sdiffstore ceshidiff ceshi ceshi1
    1
    127.0.0.1:6379> smembers ceshidiff
    value3
    127.0.0.1:6379>
    5.返回给定所有集合的交集
    127.0.0.1:6379> sinter ceshi ceshi1
    value1
    value2
    6.返回给定所有集合的交集并存储在 destination 中
    127.0.0.1:6379> sinterstore insdiff ceshi ceshi1
    2
    127.0.0.1:6379> smembers insdiff
    value1
    value2
    7.判断 member 元素是否是集合 key 的成员
    127.0.0.1:6379> sismember ceshi value1
    1    //存在
    127.0.0.1:6379> sismember ceshi value
    0   //不存在
    8.返回集合中的所有成员
    127.0.0.1:6379> smembers ceshi
    value1
    value3
    value2
    9.将 member 元素从 source 集合移动到 destination 集合
    127.0.0.1:6379> smembers ceshi
    value3
    value2
    127.0.0.1:6379> smembers outceshi
    value1
    10.移除并返回集合中的一个随机元素
    127.0.0.1:6379> spop ceshi
    value1
    127.0.0.1:6379> smembers ceshi
    value3
    value2
    11.返回集合中一个或多个随机数、
    SRANDMEMBER key [count]
    127.0.0.1:6379> srandmember ceshi 2   从集合名称为ceshi中返回随机返回两个值
    value
    value3
    12.移除集合中一个或多个成员
    127.0.0.1:6379> srem ceshi value
    1
    13.返回所有给定集合的并集
    127.0.0.1:6379> sadd unionceshi unionvalue
    1
    127.0.0.1:6379> smembers unionceshi
    unionvalue
    127.0.0.1:6379> sunion ceshi unionceshi
    value1
    unionvalue
    value2
    value3
    14.所有给定集合的并集存储在 重命名的 集合中
    127.0.0.1:6379> sunionstore unionset ceshi unionceshi
    4
    127.0.0.1:6379> smembers unionset
    value1
    unionvalue
    value2
    value3
    15.迭代集合中的元素
    127.0.0.1:6379> sscan unionset 0 match "value*"
    0
    value1
    value2
    value3
    
    • 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
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86

    Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。

    不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

    有序集合的成员是唯一的,但分数(score)却可以重复。

    HyperLogLog

    Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

    redis 发布与订阅

    Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

    Redis 客户端可以订阅任意数量的频道。

    当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

    1.搭建订阅者客户端

    再客户端中进行注册

    127.0.0.1:6379> subscribe testchat
    subscribe
    testchat
    1
    
    • 1
    • 2
    • 3
    • 4

    2.重新打开一个Redis命令行,创建发送者客户端

    127.0.0.1:6379> publish testchat "发布一个消息"
    1
    
    • 1
    • 2

    3.这时订阅者客户端收到发布者发布的消息

    127.0.0.1:6379> subscribe testchat
    subscribe
    testchat
    1
    message
    testchat
    发布一个消息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    image.png

    事务

    Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

    • 批量操作在发送 EXEC 命令前被放入队列缓存。
    • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
    • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

    一个事务从开始到执行会经历以下三个阶段:

    • 开始事务。
    • 命令入队。
    • 执行事务。

    示例:

    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set a 111
    QUEUED
    127.0.0.1:6379> set b 222
    QUEUED
    127.0.0.1:6379> set c 333
    QUEUED
    127.0.0.1:6379> exec
    OK
    OK
    OK
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    注:单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

    事务不是原子性的

    image.png

    RedisGEO

    Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。

    Redis GEO 操作方法有:

    • geoadd:添加地理位置的坐标。
    • geopos:获取地理位置的坐标。
    • geodist:计算两个位置之间的距离。
    • georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
    • georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
    • geohash:返回一个或多个位置对象的 geohash 值。

    geoadd 用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。

    GEOADD key longitude latitude member [longitude latitude member ...]
    
    • 1

    geopos 用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。

    GEOPOS key member [member ...]
    
    • 1

    geodist 用于返回两个给定位置之间的距离。

    geodist 语法格式如下:

    GEODIST key member1 member2 [m|km|ft|mi]
    
    • 1

    member1 member2 为两个地理位置。

    最后一个距离单位参数说明:

    • m :米,默认单位。
    • km :千米。
    • mi :英里。
    • ft :英尺。

    georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

    georadiusbymember 和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 georadiusbymember 的中心点是由给定的位置元素决定的, 而不是使用经度和纬度来决定中心点。

    georadius 与 georadiusbymember 语法格式如下:

    GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
    GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
    
    • 1
    • 2

    参数说明:

      • m :米,默认单位。
      • km :千米。
      • mi :英里。
      • ft :英尺。
      • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
      • WITHCOORD: 将位置元素的经度和纬度也一并返回。
      • WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
      • COUNT 限定返回的记录数。
      • ASC: 查找结果根据距离从近到远排序。
      • DESC: 查找结果根据从远到近排序。

    Redis GEO 使用 geohash 来保存地理位置的坐标。

  • 相关阅读:
    中望龙腾后端开发工程师23届7-28笔试记录
    Meta Starburst体验:HDR效果惊人,但体积重量劝退
    vue的mixins混入使用详细教程(后台接口判断),以及踩坑点
    数学建模Matlab之数据预处理方法
    37、引擎高可用方案
    【MySQL】insert和select单表查询详解(包含大量示例,看了必会)
    计算机毕业设计(附源码)python游戏推荐系统
    智慧法院解决方案-最新全套文件
    C++类和对象(二)(类对象的存储方式)
    linux后台运行java项目/ jar包:nohup 命令
  • 原文地址:https://blog.csdn.net/gexin0517/article/details/127807522