• Redis学习


    Redis学习

    这个系列大概二十个章节,目前已经学完了,分章节更


    6、key键操作

    keys * 查看当前库所有key(匹配:key *1)

    exist key 判断某个key是否存在

    type key查看key的类型

    del key 删除指定的key’数据

    unlink key 根据value选择非阻塞删除(仅将keyspace元数据中删除,真正的删除会在后序异步操作)

    expire key 10 给key设置过期时间单位秒

    ttl key 查看还有多久过期,-1表示永不过期 -2表示已过期

    select 命令切换数据库

    dbsize 查看当前数据库的key的数量

    flushdb 清空当前库

    flushall 通杀全部库

    7、redis常用数据类型

    字符串String

    string类型是二进制安全的。意味着redis的string可以包含任何数据。如jpg图片挥着序列化的对象。

    一个redis中字符串value最多可以使512M

    常用命令

    • set key value:添加键值对

      • NX:当key不存在时,可以将key-value添加数据库;
      • XX:当key存在时,可以将key-value添加数据库,与NX参数互斥
      • EX:key的超时秒数
      • PX:key的超时毫秒数,与EX互斥
      • 重复会覆盖value
    • get key:查询对应键值

    • append key value :将给定的value追加到原值的末尾

    • strlen key 获得值的长度

    • setnx key value:只有在key不存在时,设置key的值

    • incr key:

      • 将key中存储的数字值加1
      • 只能对数字值操作,如果为空,新增值为1
    • decr key:

      • 将key中存储的数字值减1
      • 只能对数字值操作,如果为空,新增值为-1
    • incrby/decrby key步长:将key中存储的数字值增减,自定义步长

    incr和decr是原子性操作(不会被线程调度机制打断的操作)

    • mset key1 value1 key2 value2…:同时设置一个或者多个key-value对
    • mget key1 key2… :同时获取一个或者多个value
    • msetnx key1 value1 key2 value2…:同时设置一个或者多个key-value对,当且仅当给定的所有key都不存在(原子性,有一个失败则都失败)
    • getrange key 起始位置 结束位置:获得值的范围,类似java中的substring,前包后包
    • setrange key 起始位置 value:用value覆盖key所存储的字符串值,从起始位置开始(索引从0开始)
    • setex key 过期时间 value:设置键值的同时设置过期时间,单位秒
    • getset key value:以新换旧,设置了新值同时获得旧值

    数据结构:

    string的数据结构是简单的动态字符串,是可以修改的字符串,内部结构类似于java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b01JWkpk-1659156278093)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220704100921035.png)]

    列表List

    单键多值

    事件单的字符串列表,按照插入顺序排序

    底层是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差

    常用命令:(左放就是逆序,右放就是正序)

    • lpush/rpush key value1 value2… :从左边/右边插入一个或者多个值

    • lpop/rpop key:从左边/右边吐出一个值,值在键在,值光键亡

    • rpoplpush key1 key2:从列表右侧吐出一个值,插入到key2列表的左边

    • lrange key start stop:按照索引下标获得元素(从左到右)lrange name 0 -1

    • lindex key index :按照索引下表获得元素(从左到右)

    • llen key :获得列表长度

    • linsert key before value newvalue :在value的后边插入newvalue

    • lrem key n value:从左边删除n个value(从左到右)

    • lset key index value :将列表下标为index的值替换为value

    数据结构:list的数据结构是快速链表quicklist。首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。

    她将所有的元素一起挨着存储,分配的是一块连续的内存

    当数据量比较多时,才会改成quicklist

    因为普通的链表需要的附加指针空间太大,会比较浪费空间。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9KF9XDWA-1659156278095)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220704103805871.png)]

    集合set

    redis的set对外提供的功能与list类似,也是一个列表的功能,特殊之处是在于set是可以去重的

    是string的无序集合,底层是一个value的null的hash表,所以可以添加、删除、查找都是O(1)

    常用命令

    • sadd key value1 value2…:讲一个或者多个member元素加到集合key中,已经存在的会被忽略
    • smembers key:取出集合里的所有值
    • sismember key value:判断集合key 是否含有该value值,1有0无
    • scard key:返回该集合的元素个数
    • srem key value1 value2…:删除集合中的某个元素
    • spop key:随机从集合中吐出一个值
    • srandmemeber key n :随机从该集合中取出n个值,不会从集合中删除
    • smove source destination value:转移
    • sinter key1 key2 :返回两个集合的交集元素
    • sunion key1 key2:返回两个集合的并集元素
    • sdiff key1 key2:返回两个集合的差集元素(key1中的不包含key2的)

    数据结构:色同时dict字典,是用哈希表实现的,使用hash结果,所有的value指向同一个内部值

    哈希hash

    redis的hash是一个键值对集合,是一个string类型的filed和value的映射表,hash特别适合用于存储对象。

    常用命令

    • hset key field value:给key集合中的field键赋值value
    • hget key1 field :从集合key1的field中取出value
    • hmset key1 field1 value1 filed2 value2>…:批量设置hash的值
    • hexists key1 field :查看key中,给定域field是否存在
    • hkeys key:列出该hash集合的所有field
    • hvals key:列出该hash集合的所有value
    • hincrby key field incrnment:为key中的filed的值加上1
    • hsetnx key field value将key中的field得值设置为value,当且仅当field不存在

    数据结构:两种:当field-value长度较短且个数较少时,shiyongziplist,否则使用hashtable

    有序集合Zset

    redis的Zset和普通的set很像,是一个没有重复元素的字符串集合

    但有序集合的每个成员都关联了一个评分,这个评分被用来按照从低到高的方式排序集合中的成员。集合的成员是唯一的,但是评分是可以重复的

    你可以根据评分或次序来获取一个范围的元素

    常用命令

    • zadd key score1 value score2 value…:将一个或者多个member元素及其评分加入到有序集合key中

    • zrange key startstop [withscores]:返回key中,下表载start-stop之间的元素;带withscores可以带评分一起返回

    • zrangebyscore key minmax [withscores] [limitoffset count]:返回key中所有score介于min和max之间的成员,按score值递增排序

    • zrevrangebyscore key maxmin [withscores] [limitoffset count]:返回key中所有score介于min和max之间的成员,递减排序

    • zincrby key increment value:为元素的score加上增量

    • zem key value:删除该集合下,指定值的元素

    • zcount key min max 统计该集合,分数区间内的元素个数

    • zrank key value 返回该值在集合中的排名,从0开】开始

      可以利用Zset实现一个文章访问量的排行榜

    数据结构:使用了两个数据结构:

    • hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值
    • 跳跃表,目的在于给元素value排序,根据score的范围获取元素列表

    跳跃表

    有序集合在生活中比较常见,例如会根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现么可以用数组、平衡树、链表等。数组不便于数据的插入、删除;平衡树或红黑树虽然效率高但是结构复杂;链表的查询需要遍历效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑偶数,但实现远比红黑树简单。

    例如从链表中查询出51利用跳跃表,查找过程如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kfJ9lWR5-1659156278097)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220704160121110.png)]

    8、配置文件

    redis端口6379被恶意攻击,导致xshell登录ssh验证失败或者持续等待问题一定要设置redis密码增强防护
    另外,加强攻防措施还可以如下:
    1、重置密码(最好没有规则)
    附随机密码生成器:https://suijimimashengcheng.bmcx.com/
    2、使用密钥+密码模式登录
    3、设置redis密码

    • 一、编辑redis.conf文件
      建议在修改前备份一下redis.conf文件,这样即使操作出错了,也可以从头再来

      • 1.注释掉 bind 127.0.0.1
        可以在 vim redis.conf 后进入指令模式(shift +:)
        然后输入:/单词
        快速找到单词的位置
      • 2.修改protected-mode
        在 redis.conf 中找到 protected-mode 将后面的 yes 改为 no
      • 3.修改daemonize
        在 redis.conf 中找到 daemonize 将后面的 no 改为 yes
      • 4.修改密码(requirepass foobared)
        在 redis.conf 中找到 requirepass foobared ,可在下面添加 requirepass 你的密码
    • 执行完以上操作后进入指令模式 wq 保存退出

    • 二、重启redis

      • 1.关闭redis
        在 redis-cli 所在的目录下输入: redis-cli -a 密码
        进入到 redis 指令模式,输入: shutdown
        然后再输入: exit
      • 2.启动redis
        在 redis-server 所在的目录下输入: redis-server redis.conf所在目录/redis.conf
        可以通过指令 ps aux | grep redis 查看redis状态
        开放端口:
        firewall-cmd --add-port=6379/tcp --permanent
        重启防火墙生效

    !!!如果是在卡住进不去,可以在服务器控制台设置快照和镜像然后重装服务器系统(注意要提前备份好数据)

    设置密码后要在代码里加上jedis.auth(“密码”)

    9、发布和订阅

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

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

    在这里插入图片描述

    命令行实现:

    1、打开一个客户端订阅channel1

    SUBSCRIBE channel1

    (打开的第一个客户端可以看到发布的消息)

    2、打开另一个客户端,给channel1发布消息hello

    publish channel1 hello

    在这里插入图片描述

    返回的是订阅者的数量

    注:发布的消息没有持久化,如果在订阅的客户端收不到hello,只能收到订阅后发布的消息

    10、新数据类型

    1)Bitmaps

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6627SaoZ-1659156278100)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220704193849200.png)]

    redis的Bitmaps就可以实现对位的操作:

    • Bitmaps本身不是一种数据类型,实际上他就是字符串(key-value),但是他可以对字符串的位进行操作
    • Bitmaps单独提供了一套指令,所以在redis中使用Bitmaps和使用字符串的方法不太一样。Bitmaps就像一个以位为单位的数组,数组的每个单元智能存储0和1,数组的下标在Bitmaps中叫做偏移量。

    在这里插入图片描述

    命令使用:

    setbit key voffset alue:设置Bitmaps中某个偏移量的值(0或者1)//偏移量从0开始

    在这里插入图片描述

    注:很多应用的用户id以一个指定的数字(如1000)开头,直接将用户id和Bitmaps的偏移量对应势必会造成浪费,通常每次做setbit操作时将用户id减去这个指定数字

    在第一次初始化BItmaps时,加入偏移量非常大,那么整个过程执行会比较慢,可能造成redis的阻塞。

    getbit key offset:获取Bitmaps中某个偏移量的值

    在这里插入图片描述

    bitcount key [start end]:统计字符串中从start字节到end字节被设置为1的bit数量

    bitop and(or/not/xor) destkey [key…]:复合操作,做多个Bitmaps的and(交集)、or(并集)、xor(异或集),并将结果保存到destkey中

    Bitmaps与set对比:

    在这里插入图片描述

    2) HyperLogLog

    一些统计问题,比如统计网站PV(pageView页面访问量),可以使用redis的incr、incrby轻松实现。

    但是像UV(uniqueVisitor,独立访客)、独立Ip数、搜索记录数等需要去重和技术问题怎么解决?这种求集合中的不重复元素的个数的问题成为基数问题。

    解决方法:

    • 数据存储在mysql中,使用distinct count计算不重复个数
    • 使用redis提供的hash、set、bitmaps等数据结构来处理

    以上方法结构精确,但是随着数据量的不断增大,导致占用空间越来越大

    降低一定的精度来平衡存储空间—>HyperLogLog:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的(12KB,可以计算接近2^64个不同元素的基数)

    命令使用:

    pfadd key element [element]:添加指定元素到HyperLogLog中

    pfcount key [key…]:计算HLL的近似基数,可以计算多个key

    pfmerge destkey sourcekey [sourcekey…]:将一个或者多个HLL合并后的结果存储在另一个HLL中

    在这里插入图片描述

    3) Geospatial

    该类型,就是元素的二维坐标,在地图上就是经纬度,redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度hash等操作

    命令使用:

    geoadd key longitude latitude member [longitude latitude member…]:添加地理位置(经度纬度名称)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ypFD61t9-1659156278111)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220704212143739.png)]

    geopos key member [member…]:获取指定地区的坐标值

    在这里插入图片描述

    geodist key member1 member2 [m|km|ft|mi]:获取两个位置之间的直线距离

    在这里插入图片描述

    georadius key longitude latitude radius m|km|mi|ft :以给定的经纬度为中心,找出某一半径之内的元素

  • 相关阅读:
    2022最新版-李宏毅机器学习深度学习课程-P23 为什么用了验证集结果还是过拟合
    数据结构 每日一练:将带头结点的单链表就地逆置(视频讲解两种方法)
    设计师最常用网站汇总
    面向大规模队列,百万并发的多优先级消费系统设计
    Execution failed for task ‘:app:javaPreCompileDebug‘.
    2022美团网络安全高校挑战赛(初赛)babyjava(XPath注入)
    打通SwiftUI任督二脉
    1688往微信小程序自营商城铺货商品采集API接口
    JSD-2204-(续)SpringGateway网关-Elasticsearch-Day06
    btstack协议栈实战篇--HID Mouse LE
  • 原文地址:https://blog.csdn.net/zypf_lover/article/details/126070777