• Redis -- 基本知识说明


    1.基本知识说明

    redis默认有16个数据库

    在这里插入图片描述
    默认使用的是第0个!
    可以使用select 进行切换数据库
    在这里插入图片描述
    在这里插入图片描述
    查看数据库所有的key

    keys *
    
    • 1

    在这里插入图片描述
    清除当前数据库

    flushdb
    
    • 1

    在这里插入图片描述
    清除全部数据库:

    FLUSHALL
    
    • 1

    redis是单线程的

    redis是基于内存操作的,CPU不是redis的性能瓶颈,redis的性能瓶颈是基于内存和网络带宽,既然可以使用单线程实现,就使用单线程了
    redis是c语言写的,官方提供的数据为100000+的QPS(每秒查询率),完全不必同样是使用key-value的Memecache差!

    redis为什么单线程还这么快?

    误区1:高性能的服务器一定是多线程的
    误区2:多线程一定比单线程性能高
    CPU > 内存 > 硬盘的速度!!!
    redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率是最高的,多线程(CPU上下文会切换:耗时操作!),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的。

    2.RedisKey

    在这里插入图片描述

    3.五大数据类型

    Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库高速缓存消息中间件MQ。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过RedisSentinel提供高可用,通过Redis Cluster提供自动分区。

    3.1 String

    127.0.0.1:6379[3]> set key1 v1
    OK
    127.0.0.1:6379[3]> get key1
    "v1"
    127.0.0.1:6379[3]> exists key1
    (integer) 1
    127.0.0.1:6379[3]> append key1 "hello"  #追加字符串,如果key不存在 == set key
    (integer) 7
    127.0.0.1:6379[3]> get key1
    "v1hello"
    127.0.0.1:6379[3]> strlen key1   #查看key1字符串的长度
    (integer) 7
    
    ####################################################################
    # 步长(通常应用在浏览量上等)
    127.0.0.1:6379[3]> set count 1
    OK
    127.0.0.1:6379[3]> incr count  #   +1
    (integer) 2
    127.0.0.1:6379[3]> incr count    
    (integer) 3
    127.0.0.1:6379[3]> decr count  #  -1
    (integer) 2
    127.0.0.1:6379[3]> incrby count 10   #  +10
    (integer) 12
    127.0.0.1:6379[3]> decrby count 5   #  -5
    (integer) 7
    
    ####################################################################
    #  字符串范围
    127.0.0.1:6379[3]> get key1
    "v1hello"
    127.0.0.1:6379[3]> getrange key1 0 3   #截取字符串【0,3】
    "v1he"
    127.0.0.1:6379[3]> getrange key1 0 -1
    "v1hello"
    
    ####################################################################
    #替换指定的字符串
    127.0.0.1:6379[3]> set key2 abcdefg
    OK
    127.0.0.1:6379[3]> get key2
    "abcdefg"
    127.0.0.1:6379[3]> setrange key2 1 xx  ##替换指定位置的字符串
    (integer) 7
    127.0.0.1:6379[3]> get key2
    "axxdefg"
    
    ####################################################################
    127.0.0.1:6379[3]> setex key3 30 "zm"   # 设置过期时间
    OK
    127.0.0.1:6379[3]> ttl key3
    (integer) 25
    127.0.0.1:6379[3]> get key3
    "zm"
    127.0.0.1:6379[3]> setnx mykey "redis"  #如果mykey不存在,则创建mykey(通常用于分布式锁)
    (integer) 1
    127.0.0.1:6379[3]> setnx mykey "mongodb"  #如果mykey存在则创建失败
    (integer) 0
    127.0.0.1:6379[3]> get mykey
    "redis"
    
    ####################################################################
    #设置多个值
    127.0.0.1:6379[3]> mset k1 v1 k2 v2 k3 v3  #同时设置多个值
    OK
    127.0.0.1:6379[3]> keys *
    1) "k1"
    2) "k3"
    3) "k2"
    127.0.0.1:6379[3]> mget k1 k2 k3  #同时获取多个值
    1) "v1"
    2) "v2"
    3) "v3"
    127.0.0.1:6379[3]> msetnx k1 v1 k4 v4   #msetnx是一个原子性的操作,要么全部成功,要么全部失败
    (integer) 0
    127.0.0.1:6379[3]> get k4
    (nil)
    
    ####################################################################
    #对象
    127.0.0.1:6379[3]> set user:1 {name:zhangsan,age:2}  #设置一个user:1对象,值为json字符来保存一个对象
    OK
    127.0.0.1:6379[3]> mset user:2:name lisi user:2:age 3
    OK
    127.0.0.1:6379[3]> mget user:2:name user:2:age
    1) "lisi"
    2) "3"
    
    ####################################################################
    #getset命令(先get再set)
    127.0.0.1:6379[3]> getset k1 redis  #如果不存在key==k1,则返回nil,并且创建k1
    (nil)
    127.0.0.1:6379[3]> get k1
    "redis"
    127.0.0.1:6379[3]> getset k1 mongodb  #如果存在值返回原来的值,并且设置新的值
    "redis"
    127.0.0.1:6379[3]> get k1
    "mongodb"
    
    • 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
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99

    3.2 List

    在redis里面,我们可以把list完成栈,队列,阻塞队列!

    #Lpush
    127.0.0.1:6379[3]> Lpush list one   #插入列表头部
    (integer) 1
    127.0.0.1:6379[3]> Lpush list two
    (integer) 2
    127.0.0.1:6379[3]> Lpush list three
    (integer) 3
    
    ####################################################################
    #Lrange
    127.0.0.1:6379[3]> Lrange list 0 -1  #获取list中的全部值
    1) "three"
    2) "two"
    3) "one"
    127.0.0.1:6379[3]> Lrange list 0 1  #获取具体的值
    1) "three"
    2) "two"
    
    ####################################################################
    #Rpush
    127.0.0.1:6379[3]> Rpush list four  #插入列表尾部
    (integer) 4
    127.0.0.1:6379[3]> Lrange list 0 -1
    1) "three"
    2) "two"
    3) "one"
    4) "four"
    
    ####################################################################
    #Lpop
    127.0.0.1:6379[3]> Lpop list  #移除列表的第一个元素
    "three"
    
    ####################################################################
    #Rpop
    127.0.0.1:6379[3]> Rpop list  #移除列表的最后一个元素
    "four"
    127.0.0.1:6379[3]> Lrange list 0 -1
    1) "two"
    2) "one"
    
    ####################################################################
    #Lindex
    127.0.0.1:6379[3]> Lindex list 1  #通过下标获取list的某一个值
    "one"
    127.0.0.1:6379[3]> Lindex list 0
    "two"
    
    ####################################################################
    #Llen
    127.0.0.1:6379[3]> Llen list  #返回列表的长度
    (integer) 2
    127.0.0.1:6379[3]> Lrange list 0 -1
    1) "3"
    2) "3"
    3) "two"
    4) "one"
    
    ####################################################################
    #Lrem
    127.0.0.1:6379[3]> Lrem list 1 one   #移除list中指定个数的value
    (integer) 1
    127.0.0.1:6379[3]> Lrange list 0 -1
    1) "3"
    2) "3"
    3) "two"
    127.0.0.1:6379[3]> Lrem list 2 3  #移除以字符串3开始的两个字符
    (integer) 2
    127.0.0.1:6379[3]> Lrange list 0 -1
    1) "two"
    
    ####################################################################
    #trim:修剪
    127.0.0.1:6379[3]> Lrange list 0 -1
    1) "hello1"
    2) "hello2"
    3) "hello2"
    4) "hello3"
    127.0.0.1:6379[3]> ltrim list 1 2   #通过下标截取指定的长度
    OK
    127.0.0.1:6379[3]> Lrange list 0 -1
    1) "hello2"
    2) "hello2"
    
    ####################################################################
    # rpoplpush:将列表最后一个元素,移动到新的列表中
    127.0.0.1:6379[3]> Lrange list 0 -1
    1) "v1"
    2) "v2"
    3) "v3"
    127.0.0.1:6379[3]> rpoplpush list otherlist
    "v3"
    127.0.0.1:6379[3]> lrange list 0 -1
    1) "v1"
    2) "v2"
    127.0.0.1:6379[3]> lrange otherlist 0 -1
    1) "v3"
    
    ####################################################################
    #lset:将列表中指定下标的值替换为另一个值
    127.0.0.1:6379[3]> exists list
    (integer) 0
    127.0.0.1:6379[3]> lset list 0 v1   #list不存在,更新失败
    (error) ERR no such key
    127.0.0.1:6379[3]> lpush list "v1"
    (integer) 1
    127.0.0.1:6379[3]> lrange list 0 0
    1) "v1"
    127.0.0.1:6379[3]> lset list 0 "item"   #将下标0的值更新
    OK
    127.0.0.1:6379[3]> lrange list 0 0
    1) "item"
    127.0.0.1:6379[3]> lset list 1 "v2"   #若下标不存在,更新失败
    (error) ERR index out of range
    
    ####################################################################
    #Linsert :将具体的value 插入到列中的某个元素的前面(after)或后面(before)
    127.0.0.1:6379[3]> flushdb
    OK
    127.0.0.1:6379[3]> rpush list v1
    (integer) 1
    127.0.0.1:6379[3]> rpush list v2
    (integer) 2
    127.0.0.1:6379[3]> Linsert list before v2 v3
    (integer) 3
    127.0.0.1:6379[3]> lrange list 0 -1
    1) "v1"
    2) "v3"
    3) "v2"
    127.0.0.1:6379[3]> Linsert list after v1 v4
    (integer) 4
    127.0.0.1:6379[3]> lrange list 0 -1
    1) "v1"
    2) "v4"
    3) "v3"
    4) "v2"
    
    
    • 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
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137

    小结:

    • 它实际上是一个链表,before Node after ,left ,right 都可以插入值
    • 如果key 不存在,创建新的链表
    • key存在,新增内容
    • 如果移除了所有的值,空链表,也代表不存在
    • 在两边插入或者改动值,效率最高!中间元素,相对来说效率更低一点
    • 实现消息排队:消息队列(Lpush Rpop) ,栈(Lpush Lpop)

    3.3 Set

    set中的值不能重复

    127.0.0.1:6379[3]> sadd set v1   #set集合中添加元素
    (integer) 1
    127.0.0.1:6379[3]> sadd set v2
    (integer) 1
    127.0.0.1:6379[3]> sadd set v3
    (integer) 1
    127.0.0.1:6379[3]> sadd set v1  #添加重复值失败
    (integer) 0
    127.0.0.1:6379[3]> smembers set   #查看指定set的所有值
    1) "v3"
    2) "v1"
    3) "v2"
    127.0.0.1:6379[3]> sismember set v2  #判断某一个值是不是在set集合中
    (integer) 1
    127.0.0.1:6379[3]> sismember set v4
    (integer) 0
    
    ####################################################################
    127.0.0.1:6379[3]> scard set   #获取set集合中的元素个数
    (integer) 3
    
    ####################################################################
    127.0.0.1:6379[3]> srem set v3  #移除某一个元素
    (integer) 1
    127.0.0.1:6379[3]> smembers set
    1) "v1"
    2) "v2"
    
    ####################################################################
    127.0.0.1:6379[3]> smembers set
    1) "v1"
    2) "v2"
    127.0.0.1:6379[3]> SRANDMEMBER set   #随机抽选出一个元素
    "v2"
    127.0.0.1:6379[3]> SRANDMEMBER set
    "v2"
    127.0.0.1:6379[3]> SRANDMEMBER set
    "v1"
    127.0.0.1:6379[3]> SRANDMEMBER set 2  #随机抽选出指定个数的元素
    1) "v1"
    2) "v2"
    
    ####################################################################
    删除元素
    127.0.0.1:6379[3]> SMEMBERS set
    1) "v1"
    2) "v2"
    127.0.0.1:6379[3]> spop set   #随机删除一个set集合中的元素
    "v2"
    127.0.0.1:6379[3]> spop set
    "v1"
    127.0.0.1:6379[3]> SMEMBERS set
    (empty array)
    
    ####################################################################
    127.0.0.1:6379[3]> SMEMBERS set
    1) "v3"
    2) "v1"
    3) "v2"
    127.0.0.1:6379[3]> SMOVE set set2 v2  #将一个指定的值移动到另一个set集合中
    (integer) 1
    127.0.0.1:6379[3]> SMEMBERS set
    1) "v3"
    2) "v1"
    127.0.0.1:6379[3]> SMEMBERS set2
    1) "v2"
    
    ####################################################################
    微博,B站,共同关注!(交集)
    127.0.0.1:6379[3]> SMEMBERS set1
    1) "a"
    2) "c"
    3) "b"
    127.0.0.1:6379[3]> SMEMBERS set2
    1) "e"
    2) "c"
    3) "d"
    127.0.0.1:6379[3]> SDIFF set1 set2  #差集
    1) "a"
    2) "b"
    127.0.0.1:6379[3]> SINTER set1 set2  #交集
    1) "c"
    127.0.0.1:6379[3]> SUNION set1 set2   #并集
    1) "c"
    2) "b"
    3) "d"
    4) "a"
    5) "e"
    
    • 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
    • 87
    • 88

    微博,A用户将所有关注的人放在一个set集合里面!将它的粉丝也放在一个集合中!
    共同关注,共同爱好,二度好友,推荐好友!(六度分割理论)

    3.4 Hash

    key - map()

    127.0.0.1:6379[3]> hset hash k1 v1   #set一个具体的 key-value
    (integer) 1
    127.0.0.1:6379[3]> hget hash k1   #获取一个字段值
    "v1"
    127.0.0.1:6379[3]> hmset hash k1 val1 k2 v2  #set多个 key-value(如果set的key值存在,则会覆盖value值)
    OK
    127.0.0.1:6379[3]> hmget hash k1 k2  #获取多个字段值
    1) "val1"
    2) "v2"
    127.0.0.1:6379[3]> hgetall hash  #获取全部的数据
    1) "k1"
    2) "val1"
    3) "k2"
    4) "v2"
    
    
    ####################################################################
    127.0.0.1:6379[3]> hdel hash k2    #删除hash指定的key-value字段
    (integer) 1
    127.0.0.1:6379[3]> hgetall hash
    1) "k1"
    2) "val1"
    
    ####################################################################
    127.0.0.1:6379[3]> hlen hash  #获取hash表的字段数量
    (integer) 1
    127.0.0.1:6379[3]> hset hash k2 v2
    (integer) 1
    127.0.0.1:6379[3]> hlen hash
    (integer) 2
    
    ####################################################################
    127.0.0.1:6379[3]> hgetall hash
    1) "k1"
    2) "val1"
    3) "k2"
    4) "v2"
    127.0.0.1:6379[3]> HEXISTS hash k1  #判断hash中指定的字段是否存在
    (integer) 1
    127.0.0.1:6379[3]> HEXISTS hash k3
    (integer) 0
    
    
    ####################################################################
    127.0.0.1:6379[3]> hkeys hash   #只获得所有的key
    1) "k1"
    2) "k2"
    127.0.0.1:6379[3]> hvals hash   #只获得所有的value
    1) "val1"
    2) "v2"
    
    ####################################################################
    127.0.0.1:6379[3]> hset hash k3 5  #指定增量
    (integer) 1
    127.0.0.1:6379[3]> HINCRBY hash k3 1  # +1
    (integer) 6
    127.0.0.1:6379[3]> HINCRBY hash k3 -2  #-2
    (integer) 4
    127.0.0.1:6379[3]> hsetnx hash k4 v4  #如果不存在则可以设置
    (integer) 1
    127.0.0.1:6379[3]> hsetnx hash k4 val4   #若key存在则设置失败
    (integer) 0
    
    
    • 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

    hash变更的数据 user : name age ,尤其是用户信息之类的,经常变动的信息!hash更适合于对象的存储,String更适合于字符串的存储!

    127.0.0.1:6379[3]> hset hash user:1:name zm user:1:age 20
    (integer) 2
    127.0.0.1:6379[3]> hget hash user:1:name user:1:age
    (error) ERR wrong number of arguments for 'hget' command
    127.0.0.1:6379[3]> hmget hash user:1:name user:1:age
    1) "zm"
    2) "20"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.5 Zset

    有序集合
    在set的基础上,添加了一个score , set k1 v1 -> zset k1 score v1

    127.0.0.1:6379[3]> zadd zset 1 one   #添加一个值
    (integer) 1
    127.0.0.1:6379[3]> zadd zset 2 two 3 three   #添加多个值
    (integer) 2
    127.0.0.1:6379[3]> ZRANGE zset 0 -1
    1) "one"
    2) "two"
    3) "three"
    
    ####################################################################
    排序如何实现?
    127.0.0.1:6379[3]> zadd salary 2500 aa  
    (integer) 1
    127.0.0.1:6379[3]> zadd salary 5000 bb
    (integer) 1
    127.0.0.1:6379[3]> zadd salary 500 cc
    (integer) 1
    127.0.0.1:6379[3]> ZRANGEBYSCORE salary -inf +inf  #显示全部的用户,按照从小到大偶排序
    1) "cc"
    2) "aa"
    3) "bb"
    127.0.0.1:6379[3]> ZRANGEBYSCORE salary -inf +inf withscores  #从小到大显示全部用户,并且加上score
    1) "cc"
    2) "500"
    3) "aa"
    4) "2500"
    5) "bb"
    6) "5000"
    127.0.0.1:6379[3]> ZRANGEBYSCORE salary -inf 2500 withscores  #显示<=2500的数值 
    1) "cc"
    2) "500"
    3) "aa"
    4) "2500"
    
    ####################################################################
    127.0.0.1:6379[3]> zrange salary 0 -1
    1) "cc"
    2) "aa"
    3) "bb"
    127.0.0.1:6379[3]> zrem salary cc  #移除有序集合中的指定元素
    (integer) 1
    127.0.0.1:6379[3]> zrange salary 0 -1
    1) "aa"
    2) "bb"
    ####################################################################
    127.0.0.1:6379[3]> zcard salary  #获取有序集合中的个数
    (integer) 2
    ####################################################################
    127.0.0.1:6379[3]> zrange zset 0 -1
    1) "one"
    2) "two"
    3) "three"
    127.0.0.1:6379[3]> zcount zset 1 3   #获取指定区间的成员数量
    (integer) 3
    127.0.0.1:6379[3]> zcount zset 1 2
    (integer) 2
    
    
    • 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

    set 排序,存储班级成绩表,工资表排序!
    普通消息,1,重要消息 2,带权重进行判断!
    排行榜应用实现,取Top N 测试!

    4.三种特殊数据类型

    4.1 geospatial

    4.2 hyperloglog

    4.3 bitmaps

  • 相关阅读:
    途家数据仓库源治理平台
    web基础与http协议
    xyhcms getshell
    【NSArray和NSDictionary的内存管理 Objective-C语言】
    策略模式在数据接收和发送场景的应用
    聊聊数据库连接池 Druid
    Kmeans
    设置区块中的交易打包数量
    前端知识点个人实践
    LeetCode146.LRU缓存
  • 原文地址:https://blog.csdn.net/qq_52025208/article/details/126276311