• redis命令行操作库、键、和五大数据类型详解


    一、数据库操作命令

    redis默认有16个数据库,类似数组下标从0开始,初始默认使用0号库。

    1.1 测试是否连通

    ping
    
    • 1

    测试服务器是否连通 返回pone就是连通了

    1.2 切换数据库

    select index
    
    • 1

    1.3 数据移动

    move key db
    
    • 1

    1.4 显示数据总量

    dbsize
    
    • 1

    1.5 数据清除

    flushdb		# 只清除当前库 
    flushall	# 16个库一起清
    
    • 1
    • 2

    二、键操作命令

    2.1 查看当前库所有key

    keys *
    
    • 1

    2.2 删除指定key

    立即删除:

    del key
    
    • 1

    异步删除:

    unlink key
    
    • 1

    2.3 获取key是否存在

    exists key
    
    • 1

    2.4 获取key的类型

    type key
    
    • 1

    2.5 更改key的名字

    # 当 key和newkey相同,或者 key不存在时,返回一个错误
    # 当 newkey 已经存在时, RENAME 命令将覆盖旧值
    rename key newkey	
    
    • 1
    • 2
    • 3
    # 当且仅当newkey不存在时,将key改名为newkey,否则不会改名
    renamenx key newkey
    
    • 1
    • 2

    2.6 指定key的有效期

    # 为当前key设置过期10秒的时间
    expire key 10
    
    # 为当前key设置过期10毫秒的时间
    pexpire key 10
    
    # 以Unix时间戳格式设置键的到期时间(不常用)
    expireat key 1393840000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.7 获取key的有效期

    # 以秒为单位返回 key 的剩余过期时间
    ttl key
    # 以毫秒为单位返回 key 的剩余过期时间
    pttl key
    
    • 1
    • 2
    • 3
    • 4

    2.8 把key从会过期的换为不会过期

    persist key
    
    • 1

    2.9 查询模式的使用

    语法结构:

    keys pattern
    
    • 1

    使用示例:

    keys *          查询所有key
    keys java*      查询所有以java开头的key
    keys *java     	查询所有以java结尾的key
    keys ??heima    查询所有前面两个字符任意,后面以java结尾的key
    keys user:?     查询所有user:开头,最后一个字符任意的key
    keys u[st]er:1  查询所有以u开头,以er:1结尾,中间包含一个字母,s或t的key
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    三、五大数据类型-string

    stringredis最基本的类型,一个key对应一个value,是一种单键单值的结构。

    string类型是二进制安全的。意味着redisstring可以包含任何数据。比如jpg图片或者序列化的对象。
    在这里插入图片描述

    3.1 添加/修改数据

    set key value
    
    • 1

    3.2 获取数据

    get key
    
    • 1

    3.3 删除数据

    del key
    
    • 1

    3.4 在key不存在时 设置key的值

    setnx key value
    
    • 1

    3.5 添加/修改多个数据

    mset key1 value1 key2 value2 …
    
    • 1

    3.6 获取多个数据

    mget key1 key2 …
    
    • 1

    3.7 获取key对应value的长度

    strlen key
    
    • 1

    3.8 追加信息到原始信息后面

    append key value
    
    • 1

    3.9 将key中储存的数字值增加指定的值

    # 将key中所储存的值加1(默认就是加1,因此不写就是加1)
    incr key
    
    # 将key中所储存的值加10
    incrby key 10
    
    # 将key中所储存的值加上指定的浮点数增量值
    incrbyfloat key 9.9
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.10 将key中储存的数字值减少指定的值

    # 将key中储存的数字值减1
    decr key
    
    # 将key中所储存的值减少指定值
    decrby key 10
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.11 设置有效时间

    # 设置键值的同时,设置过期时间(时间单位为秒)
    setex key seconds value
    
    # 设置键值的同时,设置过期时间(时间单位为毫秒)
    psetex key milliseconds value
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.12 设置指定key的值,并返回key的旧值

    GETSET db mongodb    # 首次设置没有旧值,返回 nil
    GETSET db redis      # 返回旧值 mongodb
    
    • 1
    • 2

    3.13 获取指定key对应的值的一部分数据

    # getrange key 起始位置 结束位置
    getrange key 0 3
    
    • 1
    • 2

    3.14 覆盖给定key所储存的字符串的一部分值

    # setrange key 起始位置 value
    SETRANGE key 6 "Redis"
    
    • 1
    • 2

    覆盖的位置从偏移量6开始。

    3.13 string命名规约

    比如新浪微博大V主页显示粉丝数与微博数量,这种访问量很高的数据,我们应按如下规则命名会比较好:

    • redis中为大V用户设定用户信息,以用户主键和属性值作为key,后台设定定时刷新策略即可。
    eg:	user:id:3506728370:fans		→	12210947
    eg:	user:id:3506728370:blogs	→	6164
    eg:	user:id:3506728370:focuses	→	83
    
    • 1
    • 2
    • 3
    • 也可以使用json格式保存数据
    eg:	user:id:3506728370    →	{“fans”:12210947,“blogs”:6164,“ focuses ”:83 }
    
    • 1
    • key 的设置约定
    表名主键名主键值字段名
    eg:userid29437595fans

    这样设置,不仅规则清晰,之后找数据和排错也更加方便,便于维护。

    3.14 string类型的其它注意事项

    • 数据未获取到时,返回对应的数据为nil,等同于null

    • 数据最大存储量:512MB

    • Stringredis内部存储默认就是一个字符串,当遇到增减类操作incrdecr时会转成数值型进行计算

    • 按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错

    • redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来

      的数据影响.

    3.15 string数据结构详解

    string的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。

    是可以修改的字符串,内部实现类似于JavaArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

    它内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len

    当字符串长度小于1M时,扩容都是加倍现有的空间。

    如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M

    四、五大数据类型-list

    list数据类型,一个key对应多个value,是一种单键多值的数据结构。

    Redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。

    它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

    宏观来看就是key存储这一个list的这样结构的数据:

    在这里插入图片描述

    4.1 添加/修改数据

    # 从左边插入数据
    # 语法:lpush key value1 [value2] ……
    lpush key 10 20 30
    
    # 从左边插入数据
    # 语法:rpush key value1 [value2] ……
    rpush key 10 20 30
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.2 获取并移除一个数据(弹出数据)

    lpop key    # 从左侧弹出
    rpop key    # 从右侧弹出
    
    • 1
    • 2

    每次操作只会弹出一个数据,最终值在键在,值光键亡。

    4.3 从key1列表右边吐出一个值,插到key2列表左边

    rpoplpush key1 key2
    
    • 1

    4.4 按照索引下标获得元素(从左到右获取)

    lrange key start stop
    
    # 示例
    # 0左边第一个,-1右边第一个,这就表示获取所有的意思
    lrange mylist 0 -1
    
    • 1
    • 2
    • 3
    • 4
    • 5

    range操作不会移除元素,和pop操作是不同的

    4.5 按照索引下标获得元素(从左到右)

    lindex key index 
    
    • 1

    4.6 获得列表长度

    llen key
    
    • 1

    4.7 在value的后面插入newvalue

    linsert key before value newvalue
    
    • 1

    4.8 删除count个和value相等的元素

    lrem key count value
    
    # 示例 删除5个redis字符串
    lrem mylist 5 redis
    
    • 1
    • 2
    • 3
    • 4
    • count > 0 : 从表头开始向表尾搜索,移除与value相等的元素,数量为count
    • count < 0 : 从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。
    • count = 0 : 移除表中所有与value相等的值。

    4.9 将列表key下标为index的值替换成指定value

    lset key index value 
    
    • 1

    4.10 规定时间内获取并移除数据

    # 在指定时间内 从左边移出并获取列表的第一个元素
    blpop key1 [key2] timeout
    # 在指定时间内 从右边移出并获取列表的第一个元素
    brpop key1 [key2] timeout
    # 在指定时间内 从source列表中取出最后一个元素,并插入到另外一个列表destination的头部
    brpoplpush source destination timeout
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.11 list的数据结构

    list的数据结构为快速链表quickList

    首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。

    它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当数据量比较多的时候才会改成quicklist

    因为普通的链表需要的附加指针空间太大,会比较浪费空间。

    比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prevnext

    redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。
    在这里插入图片描述

    这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。

    五、五大数据类型-hash

    hash数据类型是一个键值对集合,可以理解为左边一个key,对右边一个存储空间。

    右边这块儿存储空间叫hash,也就是说hash是指的一个数据类型。

    它指的不是一个数据,是这里边的一堆数据,那么它底层呢,是用hash表的结构来实现的。

    值得注意的是:

    如果右边存储空间数量较少,存储结构优化为类数组结构。

    如果右边存储空间数量较多,存储结构使用HashMap结构。

    在这里插入图片描述

    宏观来看就是一个string类型的field(字段)和value(值)的映射表,特别适合用于存储对象。

    类似Java里面的Map

    比如用户id为查找的key,存储的value为用户对象的各个字段的键值对:如果用普通的key/value结构来存储

    在这里插入图片描述

    这样通过 **key(用户ID) + field(属性标签) **就可以操作对应属性数据了。

    既不需要重复存储数据,也不会带来反复序列化和并发修改控制的问题。

    5.1 添加/修改数据

    # key 是redis的键   field是hash中数据的键
    hset key field value
    # 示例
    hset key name "张三"
    
    • 1
    • 2
    • 3
    • 4

    5.2 获取数据

    # 从key中取出 hash的键为field的值
    hget key field
    
    # 获取key中全部的hash数据
    hgetall key
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5.3 删除数据

    # 设置了几个field就删除几个
    hdel key field1 field2...
    
    • 1
    • 2

    5.4 设置field的值,如果该field存在则不做任何操作

    hsetnx key field value
    
    • 1

    5.5 添加/修改多个数据(批量添加)

    hmset key field1 value1 field2 value2 …
    
    • 1

    5.6 获取多个数据

    hmget key field1 field2 …
    
    • 1

    5.7 获取哈希表中字段的数量

    hlen key
    
    • 1

    5.8 获取哈希表中是否存在指定的字段

    hexists key field
    
    • 1

    5.9 列出该hash集合的所有field

    hkeys key
    
    • 1

    5.10 列出该hash集合的所有value

    hvals key
    
    • 1

    5.11 为哈希表 key 中的域 field 的值加上指定值

    # 这里的increment只能是整数
    hincrby key field increment
    
    # 这里的increment只能是浮点数
    hincrbyfloat key field increment
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5.12 当field不存在时才添加field

    hsetnx key field value
    
    • 1

    5.13 hash类型数据其它的注意事项

    • hash类型中value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。

      如果数据未获取到,对应的值为(nil)。

    • 每个hash可以存储 2^32-1个键值对

      hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。

      hash设计初衷不是为了存储大量对象而设计 的,切记不可滥用,更不可以将hash作为对象列表使用。

    • hgetall操作可以获取全部属性,如果field过多,遍历整体数据效率会很低,有可能成为数据访问瓶颈。

    5.14 hash类型对应的数据结构

    hash类型的数据结构主要有两种:ziplist(压缩列表),hashtable(哈希表)。

    field-value长度较短且个数较少时,使用ziplist,否则使用hashtable

    六、五大数据类型-set

    redisset数据类型对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的。

    当需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择。

    并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

    set是一个string类型的无序集合。它底层其实是一个valuenullhash表。
    在这里插入图片描述

    所以添加,删除,查找的复杂度都是O(1)

    一个算法,随着数据的增加,执行时间的长短,如果是O(1),那么意味着随着数据增加,查找数据的时间不变。

    这在大数据查找时就显得很有优势了。

    6.1 添加数据

    sadd key member1 [member2]...
    
    # 示例:
    asdd myset 9 8 7
    
    • 1
    • 2
    • 3
    • 4

    6.2 获取全部数据

    smembers key
    
    • 1

    6.3 删除一部分数据

    srem key member1 [member2]...
    
    • 1

    6.4 获取集合数据总量

    scard key
    
    • 1

    6.5 判断集合中是否包含指定数据

    sismember key member
    
    • 1

    6.6 随机获取集合中指定数量的数据

    srandmember key [count]
    
    • 1

    6.7 随机获取集中的某个数据并将该数据移除集合

    # count不指定时默认为1
    spop key [count]
    
    • 1
    • 2

    6.8 把集合中一个值从一个集合移动到另一个集合

    # source 源集合的名称
    # destination 目标集合的名称
    # value源集合想要移动的值
    smove source destination value
    
    • 1
    • 2
    • 3
    • 4

    6.9 返回两个集合的交集元素

    sinter key1 key2
    
    • 1

    6.10 返回两个集合的并集元素

    sunion key1 key2
    
    • 1

    6.11 返回两个集合的差集元素

    sdiff key1 key2
    
    • 1

    6.12 求两个集合的交、并、差集并存储到指定集合中

    # 求两个集合的交集元素并存储到destination集合当中
    sinterstore destination key1 key2
    
    # 求两个集合的并集元素并存储到destination集合当中
    sunionstore destination key1 key2
    
    # 求两个集合的差集元素并存储到destination集合当中
    sdiffstore destination key1 key2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    6.13 set 类型数据操作的注意事项

    • set 类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份。

    • set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间。

    6.14 set类型的数据结构

    Set数据结构是dict字典,字典是用哈希表实现的。

    JavaHashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。

    redisset结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。

    七、五大数据类型-Zset(sorted set)

    Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。

    不同之处是有序集合的每个成员都关联了一个评分(score)。

    这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。

    集合的成员是唯一的,但评分可以重复 。

    因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。

    并且访问有序集合的中间元素也是非常快的。

    优势利用zset实现一个文章访问量的排行榜,就是非常不错的选择。

    7.1 将一个或多个元素及其score 值加入到有序集 key 当中

    # 就是每个值前面得加一个分数用来排序
    zadd key score1 value1 score2 value2
    
    • 1
    • 2

    7.2 返回有序集key中,下标在start到stop之间的元素

    # WITHSCORES可加可不加,但是加了可以让分数一起和值返回到结果集
    zrange key start stop [WITHSCORES]
    
    # 示例:获取key中下边0-5之间的元素
    zrange key 0 5 WITHSCORES
    
    • 1
    • 2
    • 3
    • 4
    • 5

    7.3 返回有序集key中,所有 score 值介于min和max之间的元素

    zrangebyscore key min max [withscores] [limit offset count]
    
    # 示例
    ZRANGEBYSCORE salary -inf +inf					# 显示整个有序集salary的数据
    ZRANGEBYSCORE salary -inf +inf WITHSCORES    	# 显示整个有序集及成员的 score 值
    ZRANGEBYSCORE salary -inf 5000 WITHSCORES    	# 显示工资 <=5000 的所有成员
    ZRANGEBYSCORE salary (5000 400000				# 显示工资大于 5000 小于等于 400000 的成员
    ZRANGEBYSCORE salary (5000 (400000				# 显示工资大于 5000 小于 400000 的成员
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    包括等于 min 或 max 的元素

    返回值按score从小到大排列

    zrevrangebyscore key max min [withscores] [limit offset count]
    
    • 1

    这个和上面的用法几乎一样,只不过返回值按score从大到小排列

    7.4 为元素的score加上增量 increment

    zincrby key increment value
    
    # 示例
    zincrby myzset 2 "one"		# 返回值是增加后的分数
    
    • 1
    • 2
    • 3
    • 4

    7.4 删除有序集合中指定值的元素

    zrem key value
    
    • 1

    7.5 统计该有序集分数区间内的元素个数

    zcount key min max
    
    • 1

    7.6 返回该值在有序集合中的排名,从0开始

    zrank key value>
    
    • 1

    7.8 zset的数据结构

    zsetredis提供的一个非常特别的数据结构。

    一方面它等价于Java的数据结构Map,可以给每一个元素value赋予一个权重score。

    另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过

    score的范围来获取元素的列表。

    zset底层使用了两个数据结构:

    • hashhash的作用就是关联元素value和权重score

      保障元素value的唯一性,可以通过元素value找到相应的score值。

    • 跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

    zrevrangebyscore key max min [withscores] [limit offset count]
    
    • 1

    这个和上面的用法几乎一样,只不过返回值按score从大到小排列

    7.4 为元素的score加上增量 increment

    zincrby key increment value
    
    # 示例
    zincrby myzset 2 "one"		# 返回值是增加后的分数
    
    • 1
    • 2
    • 3
    • 4

    7.4 删除有序集合中指定值的元素

    zrem key value
    
    • 1

    7.5 统计该有序集分数区间内的元素个数

    zcount key min max
    
    • 1

    7.6 返回该值在有序集合中的排名,从0开始

    zrank key value>
    
    • 1

    7.8 zset的数据结构

    zsetredis提供的一个非常特别的数据结构。

    ZSet数据较少时底层数据结构是ziplist,数据较多时转为skiplist

    一方面它等价于Java的数据结构Map,可以给每一个元素value赋予一个权重score

    另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过

    score的范围来获取元素的列表。

    zset底层使用了两个数据结构:

    • hashhash的作用就是关联元素value和权重score

      保障元素value的唯一性,可以通过元素value找到相应的score值。

    • 跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

  • 相关阅读:
    选择「程序员」职业的8个理由
    统一观测丨使用 Prometheus 监控 SQL Server 最佳实践
    正常运行时间的敌人:过期的SSL证书
    java教程之高性能并发计数器之巅峰对决
    自动化测试面试经历
    一文深度解读边缘计算产业发展前景
    C++之容器类有趣的实验(二百四十一)
    编写函数isprime(int a),用来判断自变量a是否为素数,若是素数,函数返回整数1,否则返回0
    OpenAI发布ChatGPT:程序员瞬间不淡定了
    Apache DolphinScheduler版本2.0.5分布式集群的安装
  • 原文地址:https://blog.csdn.net/qq_44749491/article/details/128061624