Redis指令详细版---全

本文详细介绍了 Redis 的基本操作,包括数据库选择、键的管理、过期时间设置等,以及 Redis 的五大数据类型:String(如计数器、对象缓存)、List(如栈、队列操作)、Set(无重复集合)、Hash(键值对映射)和Zset(有序集合)。此外,还讨论了Redis的事务特性和Jedis客户端的使用。
摘要由CSDN通过智能技术生成

一 。基础知识和基本指令

redis 命令不区分大小写

  1. redis 默认有16个数据库

    可以在redis.windows.conf文件中找到(database 16)

  2. 默认使用的是第0个数据库

    可以使用select 切换数据库

    select 0
    
    127.0.0.1:6379[3]> select 0  #切换数据库
    OK
    127.0.0.1:6379> dbsize #查看数据库大小
    (integer) 0				#没有数据所以是0
    127.0.0.1:6379> set name qian  #插入数据
    OK
    127.0.0.1:6379> get name #查询数据
    "qian"
    127.0.0.1:6379> dbsize
    (integer) 1			#size发生了变化
    127.0.0.1:6379>
    
    
  3. **keys ***查看所有的key

    127.0.0.1:6379> keys * 
    1) "name"
    127.0.0.1:6379> set age 34
    OK
    127.0.0.1:6379> set sex ᅣ￐ 
    OK
    127.0.0.1:6379> get sex
    "\xc4\xd0"
    127.0.0.1:6379> keys *
    1) "sex"
    2) "age"
    3) "name"
    127.0.0.1:6379>
    
  4. flushall 清空所有数据(16个库全部清空)

  5. flushdb 清空当前数据库

  6. exists检查key是否存在

    127.0.0.1:6379> exists name
    (integer) 1    #存在的返回1
    127.0.0.1:6379>
    127.0.0.1:6379> exists age
    (integer) 0		#不存在返回0
    127.0.0.1:6379>
    
  7. move移除,就是删除

    127.0.0.1:6379>  move name 1 #1表示当前库
    (integer) 1 #移除name这个key和对应的值   
    127.0.0.1:6379>
    127.0.0.1:6379> exists name
    (integer) 0  #移除后检查存在
    127.0.0.1:6379>
    
  8. expire设置过期时间

    127.0.0.1:6379> set name qian
    OK
    127.0.0.1:6379> expire name 10  #设置10秒后过期
    (integer) 1
    127.0.0.1:6379> keys *
    1) "name"
    127.0.0.1:6379> keys *
    1) "name"
    127.0.0.1:6379> keys *
    1) "name"
    127.0.0.1:6379> keys *
    (empty list or set)
    127.0.0.1:6379>
    
  9. ttl查看剩余有效时间

    127.0.0.1:6379> set name qian
    OK
    127.0.0.1:6379> expire name 10
    (integer) 1
    127.0.0.1:6379> ttl name
    (integer) 6
    127.0.0.1:6379> ttl name
    (integer) 4
    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> ttl name
    (integer) -2
    127.0.0.1:6379>
    
  10. type查看key的类型

    127.0.0.1:6379> type name
    string
    127.0.0.1:6379> set 1 3
    OK
    127.0.0.1:6379> type 1
    string 		#注意上面这个1的key也是string
    127.0.0.1:6379>
    
  11. info replcation 查看当前redis的信息(在搭建集群的时候使用)

    127.0.0.1:6379> info replication
    # Replication
    role:master
    connected_slaves:0
    master_replid:38bdf044f280134fe3708430c675d6d64b94eb01
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:0
    second_repl_offset:-1
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    
  12. slaveof配置主节点

    slaveof 主节点地址   直接点端口
    

    slaveof no one

    slaveof no one #将自己设置为主机
    
  13. Redis是单线程的

    redis是基于内存操作的,CPU不是Redis的性能瓶颈,Redis的瓶颈是根据内存和网络带宽。

  14. Redis为什么单线程还这么快?

    Redis是C语言写的,官方提供的数据为100000+的QPS,这个不比Memecache差。

    • 误区1:高性能的服务器一定是多线程的!
    • 误区2:多线程(CPU上下文会切换)一定比单线程效率高 !

    核心:redis是将所有的数据放到内存中的,所以说使用单线程去操作效率就是最高的 ,多线程(CPU上下文切换是耗时的操作)。对于内存来说,没有上下文切换效率就是最高的!多次读写都是在一个CPU上的,在内存情况下,这个方案是最佳的。

二 。五大基本数据类型讲解

一.String (基本的数据类型,字符串)
  1. append 给key对应的value后面追加一个字符串

    127.0.0.1:6379> set name qian
    OK
    127.0.0.1:6379> append name 2233  #key存在追加
    (integer) 8
    127.0.0.1:6379> get name
    "qian2233"
    127.0.0.1:6379> keys *
    1) "name"
    127.0.0.1:6379> append age 30  #key 不存在set
    (integer) 2
    127.0.0.1:6379> keys *
    1) "age"
    2) "name"
    127.0.0.1:6379>
    
  2. strlen 返回key对应value的字符长度

    127.0.0.1:6379> strlen name  #返回name对应值的字符串长度
    (integer) 8
    127.0.0.1:6379> get name  
    "qian2233"
    
  3. incr实现value值的自加一 (i++运算符号)

    127.0.0.1:6379> set views 0  #初始值0
    OK
    127.0.0.1:6379> incr views   #自加1后1
    (integer) 1
    127.0.0.1:6379> incr views	 #再次自加1
    (integer) 2
    127.0.0.1:6379> get views	 #查询结果2
    "2"
    
  4. decr实现value值的自减一 (i–运算符)

    127.0.0.1:6379> get views
    "2"
    127.0.0.1:6379> decr views   #--
    (integer) 1
    127.0.0.1:6379> get views    
    "1"
    127.0.0.1:6379> decr views   #--
    (integer) 0
    127.0.0.1:6379> get views
    "0"
    
  5. incrbydecrby以给定的步长自加,自减**(i+=?)**

    127.0.0.1:6379> incrby i 10
    (integer) 10
    127.0.0.1:6379> get i
    "10"
    127.0.0.1:6379> incrby i 10
    (integer) 20
    127.0.0.1:6379> get i
    "20"
    127.0.0.1:6379> decrby i 10
    (integer) 10
    127.0.0.1:6379> get i
    "10"
    127.0.0.1:6379> decrby i 10
    (integer) 0
    127.0.0.1:6379> get i
    "0"	
    
  6. getrange截取value字符串(getrange key start end)

    127.0.0.1:6379> set q qian123456789
    OK
    127.0.0.1:6379> getrange q 2 5   #start = 2 end =5
    "an12"
    127.0.0.1:6379> getrange q 0 -1  #0~-1表示获取全部  = get
    "qian123456789"
    127.0.0.1:6379>
    
  7. setrange替换字符串(setrange key offest value) offest :偏移量(就是从第几个字符开始)

    127.0.0.1:6379> get q
    "qian123456789"
    127.0.0.1:6379> setrange q 4 xxxxxx   #第四位字符和以后的一定长度的字符替换成xxxxxx
    (integer) 13
    127.0.0.1:6379> get q
    "qianxxxxxx789"
    
  8. setex(set with expire) 设置过期时间

    127.0.0.1:6379> setex q 10 qian
    OK
    127.0.0.1:6379> get q
    "qian"
    127.0.0.1:6379> ttl q
    (integer) 3
    127.0.0.1:6379> ttl q
    (integer) 1
    127.0.0.1:6379> ttl q
    (integer) -2
    127.0.0.1:6379>
    
  9. setnx(set if not expire) 不存在才设置值(避免冲了旧数据)(在分布式锁中常用)

    127.0.0.1:6379> setnx name qian #如果name不存在才创建name = qian
    (integer) 1
    127.0.0.1:6379> get name
    "qian"
    127.0.0.1:6379> setnx name zhu #因为name存在所以返回值位0表示失败
    (integer) 0
    127.0.0.1:6379> get name
    "qian"
    
  10. mset批量设置和mget批量查询 (msetnx结合了mset 和 setnx两者的特性(如果存在会整体失败–原子性操作))

    127.0.0.1:6379> mset q 1 w 2 e 3   #批量设置
    OK
    127.0.0.1:6379> keys *
    1) "e"
    2) "w"
    3) "q"
    4) "name" 
    127.0.0.1:6379> mget q w e  #批量查询
    1) "1"
    2) "2"
    3) "3"
    127.0.0.1:6379>
    
  11. getset先get再set,如果不存在值,则返回nil。存在则获取原来的值,再设置新的值

    127.0.0.1:6379> keys *
    (empty list or set)
    127.0.0.1:6379> getset name qian
    (nil)
    127.0.0.1:6379> get name
    "qian"
    127.0.0.1:6379> getset name zhu   
    "qian"
    127.0.0.1:6379> get name
    "zhu"
    127.0.0.1:6379>
    
  12. 对象的存储

    127.0.0.1:6379> set user:1 {name:qian,age:30}   #设置一个user:1对象,值为json字符来保存一个对象
    OK
    127.0.0.1:6379> get user:1
    "{name:qian,age:30}"
    127.0.0.1:6379> mset user:1:name qian user:1:age 30
    OK
    127.0.0.1:6379> mget user:1:name user:1:age
    1) "qian"
    2) "30"
    127.0.0.1:6379>
    

String 应用场景:value除了是我们的字符串还可以是我们的数字!

  • 计数器
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存存储
二 .List (列表,实际是一个链表)

Redis里面,我们可以把list玩成,栈,队列,阻塞队列!

所有的List命令都是”l“开头的

  1. lpush将一个值或多个值插入到列表的头部(从左边插入)

  2. lrange从列表中获取数据

  3. rpush将一个或多个值插入到列表的尾部(从右边插入)

    127.0.0.1:6379> lpush name qian
    (integer) 1
    127.0.0.1:6379> lpush name en
    (integer) 2
    127.0.0.1:6379> lpush name zhu
    (integer) 3
    127.0.0.1:6379> lrange name 1 3
    1) "en"
    2) "qian"
    127.0.0.1:6379> lrange name 1 2
    1) "en"
    2) "qian"
    127.0.0.1:6379> lrange name 1 1
    1) "en"
    127.0.0.1:6379> lrange name 0 -1
    1) "zhu"
    2) "en"
    3) "qian"
    127.0.0.1:6379> lpush age 1 2 3 4 5
    (integer) 5
    127.0.0.1:6379> lrange age 0 -1
    1) "5"
    2) "4"
    3) "3"
    4) "2"
    5) "1"
    127.0.0.1:6379> rpush age 6 7
    (integer) 7
    127.0.0.1:6379> lrange age 0 -1
    1) "5"
    2) "4"
    3) "3"
    4) "2"
    5) "1"
    6) "6"
    7) "7"
    
  4. lpop移除列表中的数据(从左边移除)

  5. rpop移除列表中的数据(从右边移除)

    127.0.0.1:6379> lrange age 0 -1
    1) "5"
    2) "4"
    3) "3"
    4) "2"
    5) "1"
    6) "6"
    7) "7"
    127.0.0.1:6379> lpop age
    "5"
    127.0.0.1:6379> lrange age 0 -1
    1) "4"
    2) "3"
    3) "2"
    4) "1"
    5) "6"
    6) "7"
    127.0.0.1:6379> rpop age
    "7"
    127.0.0.1:6379> lrange age 0 -1
    1) "4"
    2) "3"
    3) "2"
    4) "1"
    5) "6"
    127.0.0.1:6379>
    
  6. lindex获取某个列表的对应下标的值

    127.0.0.1:6379> lrange age 0 -1
    1) "4"
    2) "3"
    3) "2"
    4) "1"
    5) "6"
    127.0.0.1:6379> lindex age 0
    "4"
    127.0.0.1:6379> lindex age 7
    (nil)
    127.0.0.1:6379> lindex age 4
    "6"
    
  7. llen查询列表的长度

    127.0.0.1:6379> lrange age 0 -1
    1) "4"
    2) "3"
    3) "2"
    4) "1"
    5) "6"
    127.0.0.1:6379> llen age
    (integer) 5
    
  8. lrem移除列表中的n个某个具体的值

    127.0.0.1:6379> lrange age 0 -1
    1) "3"
    2) "2"
    3) "1"
    4) "6"
    127.0.0.1:6379> lrem age 1 3   #移除列表中的1个3
    (integer) 1
    127.0.0.1:6379> lrange age 0 -1  
    1) "2"
    2) "1"
    3) "6"
    
    127.0.0.1:6379> lrange age 0 -1
    1) "2"
    2) "1"
    3) "6"
    127.0.0.1:6379> lrem age 4 1   
    (integer) 1
    127.0.0.1:6379> lrange age 0 -1  #移除4个1 因为只有一个所以移除一个
    1) "2"
    2) "6"
    
  9. ltrim通过下标截取指定长度的list,这个list被改变了,只留下截取的部分(其他的删除)

    127.0.0.1:6379> lpush list 1 2 3 4 5 6 7 8 9
    (integer) 9
    127.0.0.1:6379> lrange list 1 2  #查询 范围数据
    1) "8"
    2) "7"
    127.0.0.1:6379> lrange list 0 -1 
    1) "9"
    2) "8"
    3) "7"
    4) "6"
    5) "5"
    6) "4"
    7) "3"
    8) "2"
    9) "1"
    127.0.0.1:6379> ltrim list 1 2 #截取其中的[1,2]数据(其余的都被删除)
    OK
    127.0.0.1:6379> lrange list 0 -1
    1) "8"
    2) "7"
    127.0.0.1:6379>
    
  10. **rpoplpush **移除前一个列表的最后一个值,并将改值添加到另一个列表中列表中

    127.0.0.1:6379> lrange list 0 -1   #列表1的信息
    1) "9"
    2) "8"
    3) "7"
    4) "6"
    5) "5"
    6) "4"
    7) "3"
    8) "2"
    127.0.0.1:6379> lpush list1 00000  #列表2的信息
    (integer) 1
    127.0.0.1:6379> rpoplpush list list1 ##目标命令执行   列表2 可以不存在,执行后将自动创建
    "2"
    127.0.0.1:6379> lrange list 0 -1  #列表1中右边第一个移除了   
    1) "9"
    2) "8"
    3) "7"
    4) "6"
    5) "5"
    6) "4"
    7) "3"
    127.0.0.1:6379> lrange list1 0 -1  #列表二中,左边添加了一个数据
    1) "2"
    2) "00000"
    127.0.0.1:6379>
    
  11. lset将列表中指定下标的值,替换为另外一个值,相当于更新操作

    127.0.0.1:6379> exists list   		#需要先判读列表存在,如果不存在,将会报错   
    (integer) 1							#下标不存在也会报错
    127.0.0.1:6379> lrange list 0 -1
    1) "9"
    2) "8"
    3) "7"
    4) "6"
    5) "5"
    6) "4"
    7) "3"
    127.0.0.1:6379> lset list 3 qian   ##需要先判读列表存在,如果不存在,将会报错    #下标不存在也会报错
    OK
    127.0.0.1:6379> lrange list 0 -1
    1) "9"
    2) "8"
    3) "7"
    4) "qian"
    5) "5"
    6) "4"
    7) "3"
    127.0.0.1:6379> lset list 1 zhu   #
    OK
    127.0.0.1:6379> lrange list 0 -1
    1) "9"
    2) "zhu"
    3) "7"
    4) "qian"
    5) "5"
    6) "4"
    7) "3"
    127.0.0.1:6379>
    
  12. linsert在列表中一个具体的值前面或者后面插入另一个值

    127.0.0.1:6379> lrange list 0 -1
    1) "9"
    2) "zhu"
    3) "7"
    4) "qian"
    5) "5"
    6) "4"
    7) "3"
    127.0.0.1:6379> linsert list before zhu 0    #之前插入
    (integer) 8
    127.0.0.1:6379> lrange list 0 -1
    1) "9"
    2) "0"
    3) "zhu"
    4) "7"
    5) "qian"
    6) "5"
    7) "4"
    8) "3"
    127.0.0.1:6379> linsert list after zhu 0  #之后插入
    (integer) 9
    127.0.0.1:6379> lrange list 0 -1
    1) "9"
    2) "0"
    3) "zhu"
    4) "0"
    5) "7"
    6) "qian"
    7) "5"
    8) "4"
    9) "3"
    

    小结

  • List实际上就是一个链表,before Node after,left,right 都可以插入值
  • 如果key 存在,将创建新的链表
  • 如果key存在,就按操着处理数据
  • 如果移除了所有值,空链表也代表不存在(key也已经被删除,而不存在)
  • 在两边操作数据,效率较高。在中间操作数据效率较低
三.Set(无序不重复集合)

set无序不重复集合。

  1. sadd创建一个set并赋初值(如果初值中存在重复的,操作还是成功,知识重复的只插入了一个值)

  2. smembers查看set中的全部结果

    127.0.0.1:6379> sadd set 1 2 3 4 4  #创建并初始化set
    (integer) 4
    127.0.0.1:6379> smembers set		#查看set所有元素
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    127.0.0.1:6379>
    
  3. sismember检查set中是否存在某个值

    127.0.0.1:6379> smembers set
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    127.0.0.1:6379> sismember set 1   #存在1  返回 1
    (integer) 1
    127.0.0.1:6379> sismember set 9   #不存在9 返回 0
    (integer) 0
    
  4. scard 获取set长度

    127.0.0.1:6379> smembers set
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    127.0.0.1:6379> scard set  #获取set长度
    (integer) 4
    
  5. srem 移除指定元素(一次可移除多个)

    127.0.0.1:6379> smembers set
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    127.0.0.1:6379> srem set 2 4
    (integer) 2
    127.0.0.1:6379> smembers set
    1) "1"
    2) "3"
    
  6. srandmember取指定个数,set中的随机值(大于size返回全部)

    127.0.0.1:6379> smembers set
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    127.0.0.1:6379> srandmember set 3		#随机取3个元素
    1) "3"
    2) "1"
    3) "4"
    127.0.0.1:6379> srandmember set 1  		#随机取1个元素
    1) "2"
    127.0.0.1:6379> srandmember set 1		#随机取1个元素
    1) "4"
    127.0.0.1:6379>
    
  7. spop随机弹出元素(随机删除)(可以是多个)

    127.0.0.1:6379> smembers set
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    127.0.0.1:6379> spop set 2   #随机弹出两个元素
    1) "1"
    2) "2"
    127.0.0.1:6379> smembers set
    1) "3"
    2) "4"
    127.0.0.1:6379>
    
  8. 将一个指定元素从一个set中移动(删除)到另一个set中(添加)

    127.0.0.1:6379> smembers set1
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    127.0.0.1:6379> smembers set2
    1) "5"
    2) "6"
    3) "7"
    4) "8"
    5) "9"
    127.0.0.1:6379> smove set1 set2 1  		#移动操作
    (integer) 1
    127.0.0.1:6379> smembers set1
    1) "2"
    2) "3"
    3) "4"
    127.0.0.1:6379> smembers set2
    1) "1"
    2) "5"
    3) "6"
    4) "7"
    5) "8"
    6) "9"
    
  9. sdiff 返回两个set的差集

  10. sinter返回两个set的交集

  11. sunion 返回连个set的并集

    微博:A将用户所有关注的人放到一个集合中!将它粉丝也放在一个集合中!

    求:共同关注(关注集合的交集),二度好友(好友的交集),推荐好友(好友的差)

    127.0.0.1:6379> sadd set1 a b c d
    (integer) 4
    127.0.0.1:6379> sadd set2 c d e f
    (integer) 4
    127.0.0.1:6379> smembers set1
    1) "c"
    2) "d"
    3) "a"
    4) "b"
    127.0.0.1:6379> smembers set2
    1) "c"
    2) "e"
    3) "d"
    4) "f"
    127.0.0.1:6379> sdiff set1 set2   #set1  - set2  (差集)
    1) "a"
    2) "b"
    127.0.0.1:6379> sinter set1 set2  #set1 与  set2的交集
    1) "c"
    2) "d"
    127.0.0.1:6379> sunion set1 set2  #set1 与  set2的并集合
    1) "d"
    2) "a"
    3) "e"
    4) "c"
    5) "b"
    6) "f"
    
四. Hash(哈希)

Map集合,key->map! key-> value (value 又是一个 key->value)。

  1. hset 创建哈希,并初始化

  2. hget 取哈希中的值

    127.0.0.1:6379> hset hash name qian   #设置值
    (integer) 1
    127.0.0.1:6379> hget hash name  	  #取值
    "qian"
    
  3. hmset同时设置多个值

  4. hmget同时获取多个值

  5. hgetall获取哈希中的所有结果 (分别显示一对一对的键和值)

    127.0.0.1:6379> hmset hash name zhu age 12 sex 1
    OK
    127.0.0.1:6379> keys *
    1) "hash"
    127.0.0.1:6379> hmget hash name age sex
    1) "zhu"
    2) "12"
    3) "1"
    127.0.0.1:6379> hgetall hash
    1) "name"
    2) "zhu"
    3) "age"
    4) "12"
    5) "sex"
    6) "1"
    
  6. hdel删除hash指定的key

    127.0.0.1:6379> hgetall hash
    1) "name"
    2) "zhu"
    3) "age"
    4) "12"
    5) "sex"
    6) "1"
    127.0.0.1:6379> hdel hash name   #删除一个值
    (integer) 1
    127.0.0.1:6379> hgetall hash
    1) "age"
    2) "12"
    3) "sex"
    4) "1"
    127.0.0.1:6379
    
  7. hlen获取哈希的长度

    127.0.0.1:6379> hgetall hash
    1) "age"
    2) "12"
    3) "sex"
    4) "1"
    127.0.0.1:6379> hlen hash
    (integer) 2
    
  8. hexists验证值是否存在

    127.0.0.1:6379> hgetall hash
    1) "age"
    2) "12"
    3) "sex"
    4) "1"
    127.0.0.1:6379> hexists hash age
    (integer) 1
    127.0.0.1:6379> hexists hash name
    (integer) 0
    
  9. hkeys获取哈希中全部的key

  10. hvals获取哈希中全部的值

127.0.0.1:6379> hgetall hash
1) "age"
2) "12"
3) "sex"
4) "1"
127.0.0.1:6379> hkeys hash   #获取全部的key
1) "age"
2) "sex"
127.0.0.1:6379> hvals hash  #获取全部的value
1) "12"
2) "1"
  1. hincrby (值自加)(值自增一个负数,表示自减)

    127.0.0.1:6379> hkeys hash
    1) "age"
    2) "sex"
    127.0.0.1:6379> hvals hash
    1) "12"
    2) "1"
    127.0.0.1:6379> hincrby hash age 10
    (integer) 22
    127.0.0.1:6379> hvals hash
    1) "22"
    2) "1"
    
  2. hsetnx检查是否存在,存在返回失败,不存在返回成功

hash的应用

  • 变动的数据
  • 存储对象
五.Zset(有序集合)

在set的基础上,增加了值(一个或多个)

  1. **zadd ** 给zset添加值

    127.0.0.1:6379> zadd zset 1 one 3 tow 2 three   #给zset添加值,之中数组表示顺序,字符串表示value
    (integer) 3
    127.0.0.1:6379> zrange zset 0 -1
    1) "one"
    2) "three"
    3) "tow"
    127.0.0.1:6379> zadd zset 8 four
    (integer) 1
    127.0.0.1:6379> zrange zset 0 -1
    1) "one"
    2) "three"
    3) "tow"
    4) "four"
    
  2. zrange 获取一定范围内的值 0 -1 表示全部 并按升序返回

  3. zrevrange 获取一定范围的值 0 -1表示全部,并按降序返回

    127.0.0.1:6379> zrange age 0 -1
    1) "en"
    2) "qian"
    127.0.0.1:6379> zrevrange age 0 -1
    1) "qian"
    2) "en"
    
  4. zrangebyscore 按升序序返回值

    127.0.0.1:6379> zrange age 0 -1    #获取值  (就是按score排好序的值)
    1) "en"
    2) "zhu"
    3) "qian"
    127.0.0.1:6379> zrangebyscore age -inf +inf   #安顺序获取值  还可以设定score的范围
    1) "en"
    2) "zhu"
    3) "qian"
    127.0.0.1:6379> zrangebyscore age -inf 28 withscores   # 顺序返回值,并连带score 一起返回
    1) "en"
    2) "25"
    127.0.0.1:6379> zrangebyscore age -inf 100 withscores  # 顺序返回值,并连带score 一起返回
    1) "en"
    2) "25"
    3) "zhu"
    4) "30"
    5) "qian"
    6) "40"
    
  5. zrem移除元素

    127.0.0.1:6379> zrangebyscore age -inf 100 withscores
    1) "en"
    2) "25"
    3) "zhu"
    4) "30"
    5) "qian"
    6) "40"
    127.0.0.1:6379> zrem age zhu
    (integer) 1
    127.0.0.1:6379> zrangebyscore age -inf 100 withscores
    1) "en"
    2) "25"
    3) "qian"
    4) "40"
    
  6. zcard元素数量

    127.0.0.1:6379> zrangebyscore age -inf 100 withscores
    1) "en"
    2) "25"
    3) "qian"
    4) "40"
    127.0.0.1:6379> zcard age
    (integer) 2
    
  7. zcount zset中score的值范围内的 元素有几个

    127.0.0.1:6379> zrangebyscore age -inf 100 withscores
    1) "en"
    2) "25"
    3) "qian"
    4) "40"
    127.0.0.1:6379> zcount age 26 +inf    #26 <=score <= 正无穷 的元素有几个
    (integer) 1
    127.0.0.1:6379> zcount age 0 100
    (integer) 2
    127.0.0.1:6379>
    

应用场景

存储,成绩表,工资表,排序排序有意义的信息

带权重消息,队列

排行榜的实现

三 。三种特殊的数据类型

一. geospatial 地理位置

朋友定位,附近的人,打车距离计算

  1. geoadd 添加地理位置

  2. geodist查询两个地理位置之间的距离

  3. geohash查询城市(某个地点)的geohash的值

    127.0.0.1:6379> geoadd kunming 102.712251 25.040609 kunming 102.70786 25.03521 wuhua  #添加了两个城市的地理位置,   第一个昆明为key  第二个  和wuhua都是城市名
    (integer) 2
    127.0.0.1:6379> geodist kunming kunming wuhua  #查询kunming和wuhua之间的距离
    "746.0779"
    127.0.0.1:6379> geohash kunming kunming wuhua  #查询kunming和wuhua对应的geohash
    1) "wk3n3q8b0g0"
    2) "wk3n3jt8dt0"
    
  4. geopos查询城市的经纬度

    127.0.0.1:6379> geopos kunming kunming wuhua luanlai
    1) 1) "102.71225184202194214"
       2) "25.04060791987412671"
    2) 1) "102.7078583836555481"
       2) "25.0352089638047417"
    3) (nil)
    
  5. georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素(半径范围内的key中的所有元素)

    127.0.0.1:6379> georadius kunming 102 25 1000 km withcoord
    1) 1) "wuhua"
       2) 1) "102.7078583836555481"
          2) "25.0352089638047417"
    2) 1) "kunming"
       2) 1) "102.71225184202194214"
          2) "25.04060791987412671"
    127.0.0.1:6379> georadius kunming 102 25 1000 km withcoord  withdist
    1) 1) "wuhua"
       2) "71.4529"
       3) 1) "102.7078583836555481"
          2) "25.0352089638047417"
    2) 1) "kunming"
       2) "71.9287"
       3) 1) "102.71225184202194214"
          2) "25.04060791987412671"
    127.0.0.1:6379> georadius kunming 102 25 1000 km withcoord  withdist withhash
    1) 1) "wuhua"
       2) "71.4529"
       3) (integer) 4021138656314992
       4) 1) "102.7078583836555481"
          2) "25.0352089638047417"
    2) 1) "kunming"
       2) "71.9287"
       3) (integer) 4021138666681726
       4) 1) "102.71225184202194214"
          2) "25.04060791987412671"
    
  6. georadiusbymember这个命令和 georadius命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 georadius那样, 使用输入的经度和纬度来决定中心点

    127.0.0.1:6379> georadiusbymember kunming kunming 1000 km
    1) "wuhua"
    2) "kunming"
    127.0.0.1:6379> georadiusbymember kunming kunming 1000 m
    1) "wuhua"
    2) "kunming"
    127.0.0.1:6379> georadiusbymember kunming kunming 100 m
    1) "kunming"
    127.0.0.1:6379>
    
二. hyperloglog (超重对数)基数统计的算法(0.81%错误率,要能接受的情况才能使用)

什么是基数?

这里可以理解为一个集合中不重复的值

  1. pfadd 添加集合内容

  2. pfcount获取基数数量

    127.0.0.1:6379> pfadd hll a b b c d
    (integer) 1
    127.0.0.1:6379> pfcount hll
    (integer) 4
    
  3. pfmerge合并多个集合

    127.0.0.1:6379> pfadd fp1 a b c d e
    (integer) 1
    127.0.0.1:6379> pfcount fp1
    (integer) 5
    127.0.0.1:6379> pfadd fp2 a b f g h 
    (integer) 1
    127.0.0.1:6379> pfmerge fp3 fp1 fp2
    OK
    127.0.0.1:6379> pfcount fp3
    (integer) 8
    

优点

占用的内存是固定的,2^26个元素,基数只占用12KB内存。

应用 页面浏览量(一个人不管访问几次,只能算一个)。

三. bitmap(位图)

位存储

  1. setbit 添加位图信息

  2. **getbit **查询位图信息

  3. bitcount统计位图为1的数量

    127.0.0.1:6379> setbit qian 0 1   #设置
    (integer) 0
    127.0.0.1:6379> setbit qian 1 1   #设置
    (integer) 0
    127.0.0.1:6379> setbit qian 5 1	  #设置
    (integer) 0
    127.0.0.1:6379> bitcount qian     #统计
    (integer) 3
    127.0.0.1:6379> getbit qian 5    #查询
    (integer) 1
    127.0.0.1:6379> getbit qian 4    #查询
    (integer) 0
    

四。事务(一组命令的集合,并顺序执行)

  1. 计算机中的事务

    • 原子性:一个事务,是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
    • 一致性:事务必须是数据库从一个一致状态,变到另一个一致状态。
    • 隔离性:一个事务执行,不能被其他事务干扰。即一个事务内部的操作,及使用的数据,对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
    • 持久性:也叫永久性,一个事务一旦提交,它对数据库中数据的改变,是永久性的。
  2. redis中的事务

    redis 单条命令满足原子性,但是事务不满足原子性。事务中的命令,失败也不会回滚,反而会继续执行后面的指令。

    • 一次性
    • 顺序性
    • 排他性
    • 没有隔离级别的概念
  3. redis事务中的错误

    • 事务在执行 EXEC 之前错误:

      Redis 2.6.5 开始,服务器会对命令入队失败的情况进行记录,并在客户端调用 EXEC 命令时,拒绝执行并自动放弃这个事务

    • 命令在 EXEC 调用之后错误:

      并没有对它们进行特别处理: 即使事务中有某个/某些命令在执行时产生了错误, 事务中的其他命令仍然会继续执行

  4. redis事务中的命令

    • multi(开启事务)标记一个事务块的开始。 随后的指令将在执行EXEC时作为一个原子执行。

      127.0.0.1:6379> multi   #开始事务
      OK
      127.0.0.1:6379> set name qian   #事务的第一条指令
      QUEUED
      127.0.0.1:6379> set age 30   #事务的第二条指令
      QUEUED
      
    • exec(执行事务)执行事务中所有在排队等待的指令并将链接状态恢复到正常 当使用WATCH 时,只有当被监视的键没有被修改,且允许检查设定机制时,EXEC会被执行

      127.0.0.1:6379> multi   #开始事务
      OK
      127.0.0.1:6379> set name qian   #事务的第一条指令
      QUEUED
      127.0.0.1:6379> set age 30   #事务的第二条指令
      QUEUED
      127.0.0.1:6379> exec        #执行事务
      1) OK
      2) OK
      127.0.0.1:6379> keys *
      1) "name"
      2) "age"
      
    • discard(取消事务)当执行 DISCARD 命令时, 事务会被放弃, 事务队列会被清空, 并且客户端会从事务状态中退出:

      127.0.0.1:6379> get name
      "qian"
      127.0.0.1:6379> get age
      "30"
      127.0.0.1:6379> multi   #开启事务
      OK
      127.0.0.1:6379> set name zhu
      QUEUED
      127.0.0.1:6379> set age 18
      QUEUED
      127.0.0.1:6379> discard     #取消事务
      OK
      127.0.0.1:6379> get name
      "qian"
      
    • watch当执行 DISCARD 命令时, 事务会被放弃, 事务队列会被清空, 并且客户端会从事务状态中退出:当 EXEC 被调用时, 不管事务是否成功执行, 对所有键的监视都会被取消。(自动取消)

      (监视着某个key,当事务执行前,如果有其他的事务,修改了这个值。当exec时,事务将直接被放弃。)

      客户端一

      127.0.0.1:6379> watch name age   #添加监视
      OK
      127.0.0.1:6379> multi   #开启事务
      OK
      127.0.0.1:6379> set name zhu  #第一指令
      QUEUED
      127.0.0.1:6379> set age 18	#第二指令      到这后开启了客户端二并执行下面命令
      QUEUED
      127.0.0.1:6379> exec  #指令事务
      (nil)       #事务被放弃了,没有执行
      

      客户端二

      127.0.0.1:6379> set name en
      OK
      
    • unwatch使用无参数的 UNWATCH 命令可以手动取消对所有键的监视。 对于一些需要改动多个键的事务, 有时候程序需要同时对多个键进行加锁, 然后检查这些键的当前值是否符合程序的要求。 当值达不到要求时, 就可以使用 UNWATCH 命令来取消目前对键的监视, 中途放弃这个事务, 并等待事务的下次尝试

五。 Jedis使用

  1. 导入对应的依赖

    <dependency>
          <groupId>redis.clients</groupId>
          <artifactId>jedis</artifactId>
          <version>3.7.0</version>
    </dependency>
    <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>1.2.75</version>
    </dependency>
    
  2. 链接redis

    package com.qian;
    
    import redis.clients.jedis.Jedis;
    
    /**
     * @Author qian
     * @Date 2021/12/30 15:57
     * @Version 1.0
     */
    public class TestPing {
        public static void main(String[] args) {
            //1.new 一个 jedis对象
            Jedis jedis = new Jedis("127.0.0.1",6379);
            //检查链接是否成功
            System.out.println(jedis.ping());
            //2.指令对应 方法
            jedis.set("name","qian");
    
        }
    }
    
    //输出
    PONG
    
  3. 断开连接

    jedis.close();
    
  4. 常用API

    所有的API命令就是对应的指令

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值