• redis


     

     

     

    相关命令:https://www.runoob.com/redis/redis-benchmarks.html(具体以官网为准)

    测试:50个客户端,共10W个请求

    redis-benchmark -h localhost -p 6379 -c 50 -n 100000

    结果分析图:

     

    默认有16个数据库密(0-15),且默认使用0库

     

     清除当前数据库用flushdb,清除所有数据库用flushalll

    五大基本数据类型

    Redis-key

    127.0.0.1:6379> set name lijie1
    OK
    127.0.0.1:6379> set id 666
    OK
    127.0.0.1:6379> keys *   #查看所有key
    1) "id"
    2) "name"
    127.0.0.1:6379> exists name  #判断key是否存在
    (integer) 1
    127.0.0.1:6379> expire name 20  #设置过期时间,单位S
    (integer) 1
    127.0.0.1:6379> ttl name #查看当前key的剩余时间
    (integer) 12
    127.0.0.1:6379> ttl name
    (integer) 11
    127.0.0.1:6379> ttl name
    (integer) 8
    127.0.0.1:6379> ttl name
    (integer) 5
    127.0.0.1:6379> ttl name
    (integer) 3
    127.0.0.1:6379> ttl name
    (integer) 1
    127.0.0.1:6379> ttl name
    (integer) -2
    127.0.0.1:6379> keys *
    1) "id"
    127.0.0.1:6379> type id   #查看当前key的类型
    string
    127.0.0.1:6379>

    • String

      

    127.0.0.1:6379> set name lijie 
    OK
    127.0.0.1:6379> append name ,666  #追加,若key无,则新建
    (integer) 9
    127.0.0.1:6379> get name
    "lijie,666"
    127.0.0.1:6379> strlen name  #字符串长度
    (integer) 9
    127.0.0.1:6379>

     实现自增自减

    127.0.0.1:6379> set views 0
    OK
    127.0.0.1:6379> incr view  #默认自增1
    (integer) 1
    127.0.0.1:6379> incr view
    (integer) 2
    127.0.0.1:6379> decr view  #默认自减1
    (integer) 1
    127.0.0.1:6379> decr view
    (integer) 0
    127.0.0.1:6379> incrby views 10  #根据步长自增
    (integer) 10
    127.0.0.1:6379> incrby views 10
    (integer) 20
    127.0.0.1:6379> decrby views 5  ##根据步长自减
    (integer) 15
    127.0.0.1:6379> decrby views 5
    (integer) 10
    127.0.0.1:6379> decrby views 5
    (integer) 5
    127.0.0.1:6379> decrby views 5
    (integer) 0

    字符串范围

    27.0.0.1:6379> set name lijie,nihao
    OK
    127.0.0.1:6379> get name
    "lijie,nihao"
    127.0.0.1:6379> getrange name 5 7 #截取
    ",ni"
    127.0.0.1:6379> getrange name 0 -1 #获取全部字符串,与get name一致
    "lijie,nihao"
    127.0.0.1:6379> setrange name 0 666 #替换
    (integer) 11
    127.0.0.1:6379> get name
    "666ie,nihao"
    127.0.0.1:6379> setrange name 0 jiege #替换
    (integer) 11
    127.0.0.1:6379> get name
    "jiege,nihao"
    127.0.0.1:6379> setex name1 30 lijie2 #(set with expire )设置过期时间
    OK
    127.0.0.1:6379> ttl name1
    (integer) 21
    127.0.0.1:6379> ttl name1
    (integer) 19
    127.0.0.1:6379> setnx name2 lijie22 # set if not exists(不存在则设置)  在分布式锁中经常用到
    (integer) 1
    127.0.0.1:6379> keys *
    1) "name2"
    2) "name"
    127.0.0.1:6379> setnx name2 lijie223  #若存在,则不创建,也不能修改
    (integer) 0
    127.0.0.1:6379> get name2
    "lijie22"

    批量操作:mset 批量set

         mget批量get

         msetnx  (原子性操作)

    127.0.0.1:6379> getset name4 lijie  
    (nil)
    127.0.0.1:6379> getset name4 lijie
    "lijie"
    127.0.0.1:6379> getset name4 lijie2
    "lijie"
    127.0.0.1:6379> get name4
    "lijie2"
    127.0.0.1:6379>

    127.0.0.1:6379> MULTI #开启事务
    OK
    127.0.0.1:6379(TX)> set name1 lijie1
    QUEUED
    127.0.0.1:6379(TX)> set name2 lijie2
    QUEUED
    127.0.0.1:6379(TX)> get name2
    QUEUED
    127.0.0.1:6379(TX)> mset name3 lijie3 name4 lijie4
    QUEUED
    127.0.0.1:6379(TX)> exec #执行事务
    1) OK
    2) OK
    3) "lijie2"
    4) OK

     放弃事务

    127.0.0.1:6379> keys *
    1) "name1"
    2) "name4"
    3) "name2"
    4) "name3"
    127.0.0.1:6379> MULTI #开启事务
    OK
    127.0.0.1:6379(TX)> set name5 lijie5
    QUEUED
    127.0.0.1:6379(TX)> mset name6 lijie6 name7 lijie7
    QUEUED
    127.0.0.1:6379(TX)> DISCARD #取消事务
    OK
    127.0.0.1:6379> KEYS *  #取消事务之后,事务队列中的命令都失效
    1) "name1"
    2) "name4"
    3) "name2"
    4) "name3"

    异常

     

     watch(面试常问),watch是一个乐观锁

     

     正常情况下

    127.0.0.1:6379> mset money 50 out 0
    OK
    127.0.0.1:6379> keys *
    1) "out"
    2) "money"
    127.0.0.1:6379> WATCH money #监听money,加锁
    OK
    127.0.0.1:6379> MULTI #开启事务
    OK
    127.0.0.1:6379(TX)> DECRBY money 20 
    QUEUED
    127.0.0.1:6379(TX)> INCRBY out 20
    QUEUED
    127.0.0.1:6379(TX)> exec #执行事务
    1) (integer) 30
    2) (integer) 20

    若多线程场景下,其他线程对加锁变量进行修改,则此时会发生异常

    127.0.0.1:6379> WATCH money
    OK
    127.0.0.1:6379> MULTI
    OK
    127.0.0.1:6379(TX)> DECRBY money 5
    QUEUED
    127.0.0.1:6379(TX)> INCRBY out 5
    QUEUED
    127.0.0.1:6379(TX)> exec  #此时会发生异常
    (nil)
    127.0.0.1:6379>

    如果发生失败,获取最新值即可

    127.0.0.1:6379> UNWATCH  #如果发现失败,则先解锁
    OK
    127.0.0.1:6379> WATCH money #获取最新值,再次监视  select version
    OK
    127.0.0.1:6379> MULTI  #开启事务
    OK
    127.0.0.1:6379(TX)> DECRBY money 100
    QUEUED
    127.0.0.1:6379(TX)> INCRBY out 100
    QUEUED
    127.0.0.1:6379(TX)> exec #执行事务:对比监视的值有没有发生变化,如果没有发生变化,则可以执行,若发生变化,则执行失败,自旋锁继续执行
    1) (integer) 400
    2) (integer) 120
    127.0.0.1:6379>

    Redis单线程与多线程

  • 相关阅读:
    delphi idhttpserver ajax 跨域解决方法
    【转】安卓apk反编译(三件套) (com.googlecode.d2j.DexException: not support version问题解决)
    C++ volatile的作用
    GetProcAddress函数
    c++ CArray函数
    CString中TrimLeft()与TrimRight()的用法
    使用Windows API进行串口编程
    SetCommMask
    AttachThreadInput
    关于CoInitialize和CoUninitialize调用的有关问题
  • 原文地址:https://www.cnblogs.com/codehero/p/14974002.html
Copyright © 2020-2023  润新知