• Redis学习笔记


     视频教程来自:https://www.bilibili.com/video/BV1S54y1R7SB?p=13

    五种数据结构:

    redis 是单线程的!基于内存操作,cpu不是redis的性能瓶颈,而是根据机器的内存和网络带宽!

    字符串String详解:

    String 类似的使用场景: value除了字符串还可以是数字

    • 计数器
    • 统计多单位的数量
    • 粉丝数
    • 对象缓存
    127.0.0.1:6379>  select 3  // 切换数据库,redis默认16个数据库,从0开始
    OK
    127.0.0.1:6379[3]> DBSIZE  // 查看DB大小
    (integer) 0

    查看数据库所有的key : keys *
    清空当前数据库 : flushdb , 默认0号库
    清空所有数据库 : flushall
    key是否存在 : exists key,存在返回1, 不存在返回0
    move key 1 : 移除当前key
    expire key 10 : 设置key的过期时间 /单位s
    ttl key : 查看当前key的剩余时间
    set key : 设置key
    get key : 获取key
    type key :获取key类型

    ///////

    append key : 在key后面追加字符串,如果不存在则新建
    strlen key : 获取字符串的长度
    incr key : 自动增一
    decr key : 自动减一
    incrby key increment : 按步长增量
    decrby key increment : 按步长减量

    ////

    getrange key 0 3 : 截取字符串0~3范围
    getrange key 0 -1 : 获取所有字符串
    setrange key offset value : 从offset位置替换字符串

    ////

    setex key seconds value (set with expire) : #设置并且设定过期时间
    setnx key value (set if not exist):#不存在再设置,存在则不变 !(在分布式锁中常常使用)

    ////

    mset k1 value k2 value2 k3 value3 ... : 一次性设置多个键值对
    mget k1 k2 k3 ... : 一次性取出多个值
    msetnx k1 v1 k4 v4 : msetnx 是一个原子性操作,要么一起成功,要么一起失败

    // 对象
    set user:1 {name:zhangsan,age:3} #设置一个user:1对象,value为json字符串

    // 这里的key是一个巧妙的设计 : user:{id}:{field},如此设计在Redis中完全ok

     127.0.0.1:6379> mset user:1:name zhangsan user:1:age 20
     OK
     127.0.0.1:6379> mget user:1:name user:1:age
     1) "zhangsan"
     2) "20"
     127.0.0.1:6379>

    // 组合命令 getset 先get再set 

      127.0.0.1:6379> getset db redis  // 如果不存在,则返回nil ,并且设置新的值
      (nil)
      127.0.0.1:6379> get db   // 如果存在,则返回该值,并设置新的值
      "redis"
      127.0.0.1:6379> getset db mongodb
      "redis"

      127.0.0.1:6379> get db

      "mongodb"

    哈希hash:变更用户的的数据user name age,尤其是用户信息的保存,经常变动的信息

            更适合存储对象,string更加适合字符串存储.

    // Map集合, key - Map(key-vlaue)集合 模型
    // 所有的hash命令以h开头
    hset key field value : 设置hash值
    hmset key field value ...
    hget key field : 获取指定field的值
    hmget key field field ...
    hgetall key : 获取全部数据
    hdel key field : 删除指定key中的指定key字段,对于的value值会消失

    ////
    hlen key : 获取指定的hash的长度
    exists key : 判断hash是否存在
    hexists key field: 判断hash中字段是否存在

    ////
    hkeys : 获取所有的key
    hvals : 获取所有的值
    hincrby key field increment : 给hash中某个field值增量
    hsetnx : 如果存在则不成功,不存在则创建

    列表list:

    • 实际上是一个链表,before Node after , left ,right 都可以插入值
    • 如果key不存在,创建新的链表,如果存在则新增内容
    • 如果移除了所有值,空链表,也代表不存在
    • 在两边插入或者修改值,效率最高,中间元素,相对来说效率低一些
    • Lpush Rpop 就是消息队列 
    • lpush lpop 就是栈
    // 所有的list命令都是L开头
    lpush key value value ... : 设置一个或者多个值到列表的头部
    lrange key 0 -1 : 取出全部值,先进后出
    rpush key value .. : 设置一个或者多个值到列表的尾部
    lpop list : 移除列表第一个值 ,并返回该值
    rpop list : 尾部移除一个值 ,并返回该值
    lindex list index : 返回指定下标的值
    Llen list : 返回列表的长度
    lset key inex value : 替换指定下标的值,不存在则报错
    linsert : 插入元素进list中某个元素的前面或者后面

    // 移除指定的值 : 取消关注
    lrem key count value : 移除list中count数量的value

    ltrim key start stop : 通过下标截取指定的长度

    rpoplpush : 移除列表最后一个元素,添加新的list里面去

    集合set:无序不重复集合

    // 所有的set命令都是s开头 

    sadd key value : 添加值
    smembers key : 查看指定set所有元素
    sismember key value : 查看该set是否存在value值
    scard key : 获取元素集合中内容个数
    srem key value : 移除指定元素
    srandmember key count : 随机获取指定set中指定个数的元素,可以用来设计抽奖系统
    spop key : 随机移除元素

    // 将指定的值移动到另外的set集合中
    smove set1 set2 value : 移动set1中指定元素到set2中

    //
    sdiff k1 k2 : k1角度 k1和k2的差集
    sinter k1 k2 : k1 k2的交集 , 微博的共同好友功能通过这个实现
    sunion k1 k2 : k1 k2 的并集

    微博场景 : A用户将所有关注的人放在一个set集合中,将它的粉丝也方法在一个集合中
          共同关注 ,共同爱好, 推荐好友

    Zset(有序集合) : 排行榜应用,取Top N测试

    // 在set的基础上,增加了一个score值
    set       k1 v1 
    zset     k1 score v1

    zadd key score value : 添加一个值
    zrange key 0 -1 : 查看所有的值
    zrangebyscore key min max : 对set进行区间筛选
    zrangebyscore key -inf +inf : 对set所有数据排序
    zrangebyscore key min max withscores : 对set进行区间筛选并且显示score
    zrem key member : 移除指定member元素
    zcard key : 获取有序集合的个数
    zrevrange key start stop withscores : 反向排序,从大到小
    zcount key min max : 统计指定区间值的数量

    三种特殊数据类型  :

    • geospatial 地理位置: 朋友的定位,附近的人,打车距离计算?

          附近的人 ? 获取所有附近的人的地址,通过半径来查询

    geoadd key longitude latitude member : 添加地理位置(经度 纬度 名称)
    geopos key member : 查询指定城市的经纬度
    geodist key member1 member2 unit : 返回2个位置的距离
    georadius key longitude latitude radius km/m withdist withcoord(显示他人的定位信息): 以给定的位置为中心,找出某一半径的元素
    georadiusbymember key member radius km : 查看某个位置周边的信息
    geohash key member : 将二维的经纬度,转换成一维的hash码

    /// geo底层是zset ,因此可以执行zset的移除命令,移除查找geo中的元素
    • Hyperloglog : 网站访问统计 ,0.81%错误率,统计uv任务
    基础统计的算法!
    优点:占用的内存是固定的,只需要12kb内存,如果从内存的角度来比较Hyperloglog首选

    网页的UV(一个人访问一个网站多次,但是还是算作一个访问量)
    传统方式,使用set保存用户的id,然后统计set中的元素个数为标准判断!
    这个方式如果保存了大量的用户id,就会比较麻烦,我们的目的是为了计数,而不是保存id


    如果允许容错,那么一定可以使用Hyperloglog ! 如果不允许,就使用set或者自己的数据类型 pfadd key element : 添加元素 pfcount key : 统计key中的元素个数 pfmerge destkey key1 key2 : 查看并集的数量
    • Bitmap :  统计用户活动信息,活跃不活跃,登录未登录,打卡等
    位图 : 数据结构,都是操作二进制位来记录状态,就是只有0和1 两个状态
    setbit key offset value : 设置offset值 0 或者1
      打卡举例 : setbit sign 1(周一) 0(未打卡)
    getbit key offset : 获取offset值
    bitcount key : 获取1的数量

    Redis事务 :

    Redis事务的本质: 一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!一次性,顺序性,排他性
    Redis事务没有隔离级别的概念!
    所有的命令在事务中,并没有直接被执行,只有发起exec命令的时候才会执行
    Redis单挑命令保证原子性,但是事务部保证原子性

    ////
    开启事务 :multi
    入队:输入命令
    执行: exec

    编译异常(代码有问题/ 命令有错) 事务中所有的命令都不会被执行

    运行时异常(1/0)如果事务队列中存在语法错误,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常




    监控 :Watch 解除监控unWatch

    悲观锁 : 认为什么时候都会出问题,无论做什么都会加锁
    乐观锁: 很乐观,认为什么时候都不会出现问题,所以不会上锁!在更新数据的时候判断一下,在此期间是否有人修改过数据
      获取version
      更新的时候比较version

    如果发现事务执行失败,就先解锁,获取最新的值,再次监视

    redis-benchmark : 一个压力测试工具

    // 测试: 100个并发连接, 100000 请求
    
    redis-benchmark -h localhost -p 6379 -c 100 -n 100000
  • 相关阅读:
    MBR 无文件攻击 这两个mbr勒索病毒太凶残了 我虚拟机里运行 都让我宿主机出现了蓝屏!
    powersploit使用方法——果然是过时了,好多命令都无法成功执行
    基于脚本的攻击或可绕过微软的反恶意软件扫描接口(AMSI)
    Window下常见的权限维持方式
    metasploit MSFVenom 生成powershell paylod todo 无文件攻击 msiexec /quiet /qn /i shell.msi
    Window权限维持(一):注册表运行键
    一文讲解API网关核心功能——就是nginx,无非加入了安全、流控、转换、版本控制等功能
    AMSI 浅析及绕过——写得很深入,看来amsi还是静态方式做的,没有做到运行时检测,检测的银弹在哪里呢,语义分析和机器学习吗?
    Window权限维持(三):新服务
    PSattack:一个渗透测试中使用的万能框架——还是有些过时啊,属于整合类工具,将其他好用的模块放到一起
  • 原文地址:https://www.cnblogs.com/padazala/p/12677448.html
Copyright © 2020-2023  润新知