6.redis五大基本数据类型

五大基本的数据类型:

1.Striing类型

1.String类型
    1.追加内容
            127.0.0.1:6379> keys *
                1) "name"
            127.0.0.1:6379> get name
                "wmd"
            127.0.0.1:6379> APPEND name "hello"(使用APPEND可以追加字符串)
                (integer) 8
            127.0.0.1:6379> get name
                "wmdhello"
            127.0.0.1:6379>
            若追加的key不存在,相当于新创建了一个记录
            127.0.0.1:6379> APPEND age "18"
                (integer) 2
            127.0.0.1:6379> keys *
                1) "age"
                2) "name"
    2.字符串长度:STRLEN key值
        127.0.0.1:6379> STRLEN name
            (integer) 8
    3.数字加一和减一的操作
        127.0.0.1:6379> get age
            "18"
        127.0.0.1:6379> INCR age (age+1)
            (integer) 19
        127.0.0.1:6379> get age
            "19"
        127.0.0.1:6379> DECR age(age-1)
            (integer) 18
        127.0.0.1:6379> get age
            "18"
    4.设置步长增加
        127.0.0.1:6379> INCRBY age 10(增加10)
            (integer) 28
        127.0.0.1:6379> get age
            "28"
        127.0.0.1:6379> DECRBY age 5
            (integer) 23(基础上减5)
        127.0.0.1:6379> get age
            "23"

      
   5.截取字符串GETRANGE(range:范围)
       127.0.0.1:6379> set key1 hello,wmd
             OK
        127.0.0.1:6379> get key1
            "hello,wmd"
        127.0.0.1:6379> GETRANGE key1 0 4(截取key1字符串的0-4位)
            "hello"
        127.0.0.1:6379> GETRANGE key1 0 -1(截取key1字符串的全部-1代表结尾)
            "hello,wmd" 
    
    6.字符串替换(SETRANGE)
        127.0.0.1:6379> SETRANGE key1 1 ld(从key1的1位置处开始替换,ld有两个字符,对应的替换其两个字符)
            (integer) 9
        127.0.0.1:6379> get key1
            "hldlo,wmd"
        127.0.0.1:6379> SETRANGE key1 1 ld
            (integer) 9
        127.0.0.1:6379> get key1
            "hldlo,wmd"
    7.设置过期时间:SETEX(set with expire:设置如果存在)
        127.0.0.1:6379> SETEX key3 30 wmd
            OK
        127.0.0.1:6379> ttl key3
            (integer) 25
        结论:30秒后会删除掉key3
        骚操作
            127.0.0.1:6379> SETEX key3 30 wmd(设置key3过期时间为30秒,并设置内容是wmd)
                OK
            127.0.0.1:6379> ttl key3
                (integer) 25
            127.0.0.1:6379> get key3
                "wmd"
            127.0.0.1:6379> SETEX key3 50 ld(在未过期期间,重新更改key3的值和过期时间)
                OK
            127.0.0.1:6379> ttl key3(发现过期时间发生了更改,并且内容也发生更改)
                (integer) 43
            127.0.0.1:6379> get key3
                "ld"

    8.不覆盖赋值:SETNX(set if not expire:如果不存在会)如果存在就不会创建,分布式锁中会用到!!
        127.0.0.1:6379> SETNX key4 redis(设置key4的值,返回1表示设置成功)
            (integer) 1
        127.0.0.1:6379> get key4
            "redis"
        127.0.0.1:6379> SETNX key4 modb(使用SETNX重新设置key4值,返回0)
            (integer) 0
        127.0.0.1:6379> get key4(获取key4仍是redis)
            "redis"
        127.0.0.1:6379> set key4 modb(但是可以使用set命令直接更改)
            OK
        127.0.0.1:6379> get key4
            "modb"
    
    9.批量的设置值:MSET 
            127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
                OK
            127.0.0.1:6379> keys *
                1) "k2"
                2) "k1"
                3) "k3"
    10.批量的取数据MGET 
        127.0.0.1:6379> MGET k1 k2 k3
            1) "v1"
            2) "v2"
            3) "v3"
    11.批量的存在就不保存操作:MSETNX(和SETNX有异曲同工之妙)
            127.0.0.1:6379> MSETNX k3 k3_bak k4 v4
                (integer) 0
            127.0.0.1:6379> keys *
                1) "k2"
                2) "k1"
                3) "k3" 
        结论:发现 MSETNX 是原子性操作,失败都失败,因有k3,所以k3的值设置失败,后面的k4也没有设置 
     
     11.存入对象:设置一个user1对象,值是json字符串
         127.0.0.1:6379> keys *
            1) "user:1"
        127.0.0.1:6379> GET user:1
            "{name:wmd,age:18}"
     12.也可以如此设置:这是key的巧妙设计(user:wmd:{id}:name)
         127.0.0.1:6379> MSET user:wmd:1:name wmd user:wmd:1:age 18
                OK
         127.0.0.1:6379> keys *
                1) "user:wmd:1:age"
                2) "user:wmd:1:name"
        127.0.0.1:6379> MGET user:wmd:1:name user:wmd:1:age
                1) "wmd"
                2) "18"
                
    13.先get后set的组合命令:GETSET 
        127.0.0.1:6379> GETSET db redis(如果不存在值,则返回nil,并set入新值)
            (nil)
        127.0.0.1:6379> get db(如果存在值,则返回原来的值,并set新的值)
            "redis"
        127.0.0.1:6379> GETSET db mongdb
            "redis"
        127.0.0.1:6379> get db
            "mongdb"

总结:String类型的使用场景,value除了可以是字符串外,还可以是数字
    。通过加一减一的操作实现计数器
    。统计多单位的数量
    。粉丝数
    。对象存储

2.List类型

在redis中,可以将list玩成栈(一端开放:先进后出),队列(两端开放:一端放,一端取,先进先出),阻塞队列(两边都可以放,两边都可以取)
list中的命令大都是以L开头的    
    1.从左向右放值:LPUSH 
        127.0.0.1:6379> LPUSH wmd one
            (integer) 1
        127.0.0.1:6379> LPUSH wmd two
            (integer) 2
        127.0.0.1:6379> LPUSH wmd three
            (integer) 3
        127.0.0.1:6379> LRANGE wmd 0 -1(从左向右取值0 -1代表取全部的值:发现后放入的值在前)
            1) "three"
            2) "two"
            3) "one"
    2.从右边放值:RPUSH(从右边放值)
        127.0.0.1:6379> RPUSH wmd four
            (integer) 4
        127.0.0.1:6379> LRANGE wmd 0 -1(取出所有的值发现RPUSH放入的值在后面)
            1) "three"
            2) "two"
            3) "one"
            4) "four"
   3.获取list中的值LRANGE 名称 开始 结束
        127.0.0.1:6379> LRANGE wmd 0(获取第一个元素:这种命令不可用,报错,必须指定结束位置)
            (error) ERR wrong number of arguments for 'lrange' command
        127.0.0.1:6379> LRANGE wmd 0 1(获取第一个和第二个元素)
            1) "three"
            2) "two"
        127.0.0.1:6379> LRANGE wmd 0 0(开始位置和结束位置相同,获取第一个元素)
            1) "three"  
            
            
    4.移除命令:LPOP 队列名(从左侧移除第一个元素)/RPOP 队列名(从右侧移除第一个元素)
        原始:
            1) "three"
            2) "two"
            3) "one"
            4) "four"
        127.0.0.1:6379> LPOP wmd (从左侧移除第一个元素)
            "three"
        127.0.0.1:6379> LRANGE wmd 0 -1(发现移除了three)
            1) "two"
            2) "one"
            3) "four"
        127.0.0.1:6379> RPOP wmd (右侧移除第一个元素)
            "four"
        127.0.0.1:6379> LRANGE wmd 0 -1(发现移除了four)
            1) "two"
            2) "one"

    5.获取队列的某一个值:LINDEX 队列名 下标
        127.0.0.1:6379> LRANGE wmd 0 -1
            1) "two"
            2) "one"
        127.0.0.1:6379> LINDEX wmd 1(获取wmd队列的第二个值)
            "one"
    
    6.队列的长度:LLEN 队列名
        127.0.0.1:6379> LLEN wmd
            (integer) 2
            
    7.移除某个固定的值:LREM 队列名称 移除几个(因为队列中可以有重复的值) 移除的名称
        127.0.0.1:6379> LRANGE wmd 0 -1(往集合中放入重复的four和three,以及不重复的one和two)
            1) "four"
            2) "four"
            3) "three"
            4) "three"
            5) "two"
            6) "one"
        127.0.0.1:6379> LREM wmd 1 one(移除集合中的一个one)
            (integer) 1
        127.0.0.1:6379> LRANGE wmd 0 -1(发现队列中的one被移除)
            1) "four"
            2) "four"
            3) "three"
            4) "three"
            5) "two"
        127.0.0.1:6379> 
        127.0.0.1:6379> LREM wmd 1 four(移除队列中的一个four)
            (integer) 1
        127.0.0.1:6379> LRANGE wmd 0 -1(发现队列中的一个four被移除,还剩一个four)
            1) "four"
            2) "three"
            3) "three"
            4) "two"
        127.0.0.1:6379> LREM wmd 2 three(移除队列中的两个three)
            (integer) 2
        127.0.0.1:6379> LRANGE wmd 0 -1(发现对列中的两个three都被移除)
            1) "four"
            2) "two"
    
    8.截取固定范围的值:LTRIM 队列名称 开始位置 结束位置
        127.0.0.1:6379> RPUSH wmd hello1
            (integer) 1
        127.0.0.1:6379> RPUSH wmd hello2
            (integer) 2
        127.0.0.1:6379> RPUSH wmd hello3
            (integer) 3
        127.0.0.1:6379> RPUSH wmd hello4
            (integer) 4
        127.0.0.1:6379> LRANGE wmd 0 -1
            1) "hello1"
            2) "hello2"
            3) "hello3"
            4) "hello4"
        127.0.0.1:6379> LTRIM wmd 1 2(截取从1-2的元素)
            OK
        127.0.0.1:6379> LRANGE wmd 0 -1
            1) "hello2"
            2) "hello3"
    
    8.移除列表的最后一个元素并添加到新的列表中:组合命令:RPOPLPUSH 原列表 新的列表(从右边拿到原列表的最后一个元素并从左边添加到新的列表中)
        127.0.0.1:6379> LRANGE wmd 0 -1(原队列中的元素如下:)
            1) "hello1"
            2) "hello2"
            3) "hello3"
        127.0.0.1:6379> RPOPLPUSH wmd wmd2(取出原列表wmd的最后一个元素并添加到新的列表中wmd2)
            "hello3"
        127.0.0.1:6379> LRANGE wmd 0 -1(发现原列表的最后一个元素被删除)
            1) "hello1"
            2) "hello2"
        127.0.0.1:6379> LRANGE wmd2 0 -1(移动到新的列表中wmd2)
            1) "hello3"
        127.0.0.1:6379> RPOPLPUSH wmd wmd2
            "hello2"
        127.0.0.1:6379> LRANGE wmd2 0 -1(发现新列表元素是从左边开始放的)
            1) "hello2"
            2) "hello3"
    9.将列表的指定下标的值替换成其他值:lset 队列名 下表 替换的值(1.列表必须存在  2.列表中需要替换的元素必须存在)
        127.0.0.1:6379> lset wmd 0 v1(当不存在列表时替换会报错)
            (error) ERR no such key
        127.0.0.1:6379> RPUSH wmd v1(创建了列表,并放入一个元素v1)
            (integer) 1
        127.0.0.1:6379> LRANGE wmd 0 -1
            1) "v1"
        127.0.0.1:6379> LSET wmd 0 firstOne(替换wmd列表的第一个元素为firstOne)
            OK
        127.0.0.1:6379> LRANGE wmd 0 -1(替换成功)
            1) "firstOne"
        127.0.0.1:6379> LSET wmd 1 secordOne(替换不存在的2元素报错)
            (error) ERR index out of range
    
    10.在列表指定元素的前后插入元素: LINSERT 列表 before/after 列表中的元素 插入的元素
        127.0.0.1:6379> RPUSH wmd v1(创建一个v1,v2的列表)
            (integer) 1
        127.0.0.1:6379> RPUSH wmd v2
            (integer) 2
        127.0.0.1:6379> LRANGE wmd 0 -1
            1) "v1"
            2) "v2"
        127.0.0.1:6379> LINSERT wmd before v2 ld(在v2的前面插入ld)
            (integer) 3
        127.0.0.1:6379> LRANGE wmd 0 -1(插入成功)
            1) "v1"
            2) "ld"
            3) "v2"
        127.0.0.1:6379> LINSERT wmd after  ld wmd (在ld的后面插入wmd)
            (integer) 4
        127.0.0.1:6379> LRANGE wmd 0 -1(插入成功)
            1) "v1"
            2) "ld"
            3) "wmd"
            4) "v2"
        127.0.0.1:6379> LINSERT wmd after  ee wmd (如果在队列中没有的元素前后插入会返回-1)
            (integer) -1


小结:
    1.其实就是一个链表,左右都可以插入数据
    2.如果key(就是链表)不存在,就创建新的链表
    3.如果key存在,新增内容
    4.如果移除了所有内容,空链表,也代表不存在
    5.在两边插入或改动值,效率会更高,中间元素,效率会低点
    6.可以做成消息队列(左边放,右边取)也可以做成栈(左边放,左边取)

SET(集合)

1.set中的值是不能重复的
2.set的命令大都是s开头的
3.set是无序不重复集合
    1.往set集合中放值:SADD 集合名称  值
            127.0.0.1:6379> SADD wmd "v1"
                (integer) 1
            127.0.0.1:6379> SADD wmd "v2"
                (integer) 1
            127.0.0.1:6379> SADD wmd "v3"
                (integer) 1
            127.0.0.1:6379> SMEMBERS wmd(取出队列的值)
                1) "v3"
                2) "v1"
                3) "v2"
    2.判断集合中是否存在指定的值:SISMEMBER set集合名称 对应的值
            127.0.0.1:6379> SISMEMBER wmd ld
                (integer) 0(返回0是不存在)
            127.0.0.1:6379> SISMEMBER wmd v1
                (integer) 1(返回1是存在)
                
    3.返回set集合的长度:scard 集合名称
            127.0.0.1:6379> SCARD wmd(返回wmd集合的长度)
                (integer) 4
    
    4.移除集合中的指定元素:SREM 集合名称 元素值
            127.0.0.1:6379> SREM wmd 5(移除不存在的值时返回的时0)
                (integer) 0
            127.0.0.1:6379> SREM wmd v1(移除存在的值返回的时1)
                (integer) 1
                
    5.随机抽选出集合中的一个或多个值:SRANDMEMBER 集合名称 抽取的个数
            127.0.0.1:6379> SRANDMEMBER wmd(随机抽选出一个值)
                "v2"
            127.0.0.1:6379> SRANDMEMBER wmd (随机抽选出一个值)
                "45"
            127.0.0.1:6379> SRANDMEMBER wmd 2(随机抽选出两个值)
                1) "v3"
                2) "v2"
    6.随机的删除单个或多个值:SPOP set名称 随机删除的个数
            127.0.0.1:6379> SMEMBERS wmd
                1) "v3"
                2) "v4"
                3) "v1"
                4) "v2"
                5) "v5"
            127.0.0.1:6379> SPOP wmd 2(随机删除两个)
                1) "v3"
                2) "v1"
            127.0.0.1:6379> SPOP wmd(随机删除一个)
                "v4"
            127.0.0.1:6379> SMEMBERS wmd
                1) "v5"
                2) "v2"
    7.将set集合中的元素移动到另外一个集合中:SMOVE 原集合 目标集合 移动元素
            127.0.0.1:6379> SMEMBERS wmd(wmd的元素)
                1) "wmd4"
                2) "wmd3"
                3) "wmd2"
                4) "wmd1"
            127.0.0.1:6379> SMOVE wmd ld wmd1(将wmd中的wmd1元素移动到ld集合中,若ld集合不存在,则创建)
                (integer) 1
            127.0.0.1:6379> keys *
                1) "ld"
                2) "wmd"
            127.0.0.1:6379> SMEMBERS ld
                1) "wmd1"
    8.多个set集合的交集/差集/并集
        1.交集:两个集合相同的部分:SINTER 集合1  集合2
        2.差集:两个集合不一样的地方:SDIFF 集合1 集合2(集合1中没有集合2中的元素)
        3.并集:两个集合的并集:SUNION 集合1 集合2
                127.0.0.1:6379> SMEMBERS wmd(两个集合wmd/ld,两个集合都有c元素)
                    1) "c"
                    2) "a"
                    3) "b"
                127.0.0.1:6379> SMEMBERS ld(两个集合wmd/ld,两个集合都有c元素)
                    1) "c"
                    2) "e"
                    3) "d"
                127.0.0.1:6379> SDIFF wmd ld(差集:已wmd集合为基础,查询wmd集合中没有ld集合的元素,即差集)
                    1) "a"
                    2) "b"
                127.0.0.1:6379> SINTER wmd ld(两个集合的交集)
                    1) "c"
                127.0.0.1:6379> SUNION wmd ld(两个集合的并集)
                    1) "a"
                    2) "c"
                    3) "e"
                    4) "b"
                    5) "d"

Hash(哈希)

map集合,key-map集合:本质上和string没有区别,还是一个简单的key-value
命令大多是h开头的
    1.放值/取值:hset/hget
        127.0.0.1:6379> HSET myhash k1 v1(HSET hash名称 key值 value值)
            (integer) 1
        127.0.0.1:6379> HGET myhash k1(hget hash名称 key)
            "v1"
            
    2.批量插入和批量获取:
        127.0.0.1:6379> HMSET myhash k1 v1_bak k2 v2 k3 v3(HMSET hash名称  k1 v1  k2 v2)如果存在key,则会覆盖其value值
            OK
        127.0.0.1:6379> HMGET myhash k1 k2 k3 (批量获取HMGET hash名称 k1 k2 k3)
            1) "v1_bak"
            2) "v2"
            3) "v3"
            
    3.获取hash中的所有key和value:HGETALL hash名称
        127.0.0.1:6379> HGETALL myhash(返回的是key和value)
            1) "k1"
            2) "v1_bak"
            3) "k2"
            4) "v2"
            5) "k3"
            6) "v3"
    4.删除hash中指定的key字段,对应的value值也就消失了
            127.0.0.1:6379> HGETALL myhash(获取全部的key和value)
                1) "k1"
                2) "v1_bak"
                3) "k2"
                4) "v2"
                5) "k3"
                6) "v3"
            127.0.0.1:6379> HDEL myhash k1(删除myhash中的k1键值对)
                (integer) 1
            127.0.0.1:6379> HGETALL myhash(发现key1键值对已被删除)
                1) "k2"
                2) "v2"
                3) "k3"
                4) "v3"
    5.返回hash的键值对长度:HLEN hash名称
            127.0.0.1:6379> HGETALL myhash
                1) "k2"
                2) "v2"
                3) "k3"
                4) "v3"
            127.0.0.1:6379> HLEN myhash(返回的是hash的键值对长度)
                (integer) 2
    6.判断hash中是否存在指定的key:HEXISTS hash名称  key值
            127.0.0.1:6379> HEXISTS myhash k1(不存在返回0)
                (integer) 0
            127.0.0.1:6379> HEXISTS myhash k2(存在返回1)
                (integer) 1
    7.只获取所有的key值/value值:
            127.0.0.1:6379> HKEYS myhash(只获取所有的key值)
                1) "k2"
                2) "k3"
            127.0.0.1:6379> HVALS myhash(只获取所有的value值)
                1) "v2"
                2) "v3"
    8.hash中数字的加减操作:HINCRBY hash名称 对应的key值 加减的数值
        127.0.0.1:6379> HSET myhash k1 4(hash中放入k1=4)
            (integer) 1
        127.0.0.1:6379> HGETALL myhash
            5) "k1"
            6) "4"
        127.0.0.1:6379> HINCRBY myhash k1 10(k1数值+10)
            (integer) 14
        127.0.0.1:6379> HGETALL myhash(k1数值变成了14)
            5) "k1"
            6) "14"
        127.0.0.1:6379> HINCRBY myhash k1 -3(k1数值-3)
            (integer) 11
        127.0.0.1:6379> HGETALL myhash(k1数值-3)
            5) "k1"
            6) "11"
    9.hash中如果存在则不能设置,不存在可以设置
        127.0.0.1:6379> HSETNX myhash k1 14(hash中不存在k1,所以设置成功返回1)
            (integer) 1
        127.0.0.1:6379> HSETNX myhash k1 10(hash中存在k1,所以设置失败返回0)
            (integer) 0
    
    10.hash中存储像对象一样的数据
            127.0.0.1:6379> HMSET user:1 name wmd age 19(多个k-v可以同时设置,不用像string那样,每次逗得写user:1)
                    OK
            127.0.0.1:6379> HMGET user:1 name(获取1对象的name值)
                1) "wmd"
            127.0.0.1:6379> HMGET user:1 age(获取1对象的age值)
                1) "19"

Zset(有序集合):参考地址:https://www.cnblogs.com/hunternet/p/12717643.html

有序集合
    1.往有序集合中放入值ZADD zset名称 放入的位置 值
        127.0.0.1:6379> ZADD myZset 1 wmd(往myZset的第一个位置上添加wmd)
            (integer) 1
        127.0.0.1:6379> ZADD myZset 2 ld(往myZset的第二个位置上添加ld)
            (integer) 1
        127.0.0.1:6379> ZRANGE myZset 0 -1(取出myZset的所有值)
            1) "wmd"
            2) "ld"
        127.0.0.1:6379> ZADD myZset 1 wdx(在第一个位置上放入wdx)
            (integer) 1
        127.0.0.1:6379> ZRANGE myZset 0 -1(获取zset时,发现是有序的)
            1) "wdx"
            2) "wmd"
            3) "ld"
        
    等等等等:参考地址:https://www.cnblogs.com/hunternet/p/12717643.html

 

posted @ 2022-05-25 21:28  努力的达子  阅读(42)  评论(0编辑  收藏  举报