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

绝地灬酷狼 2024-03-31 12:04 9阅读 0赞

一、数据库操作命令

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

1.1 测试是否连通

  1. ping

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

1.2 切换数据库

  1. select index

1.3 数据移动

  1. move key db

1.4 显示数据总量

  1. dbsize

1.5 数据清除

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

二、键操作命令

2.1 查看当前库所有key

  1. keys *

2.2 删除指定key

立即删除:

  1. del key

异步删除:

  1. unlink key

2.3 获取key是否存在

  1. exists key

2.4 获取key的类型

  1. type key

2.5 更改key的名字

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

2.6 指定key的有效期

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

2.7 获取key的有效期

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

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

  1. persist key

2.9 查询模式的使用

语法结构:

  1. keys pattern

使用示例:

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

三、五大数据类型-string

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

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

3.1 添加/修改数据

  1. set key value

3.2 获取数据

  1. get key

3.3 删除数据

  1. del key

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

  1. setnx key value

3.5 添加/修改多个数据

  1. mset key1 value1 key2 value2

3.6 获取多个数据

  1. mget key1 key2

3.7 获取key对应value的长度

  1. strlen key

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

  1. append key value

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

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

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

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

3.11 设置有效时间

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

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

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

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

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

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

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

覆盖的位置从偏移量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

  • 也可以使用json格式保存数据

    eg: user:id:3506728370 → {“fans”:12210947,“blogs”:6164,“ focuses ”:83 }

  • key 的设置约定




















表名 主键名 主键值 字段名
eg: user id 29437595 fans

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

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 添加/修改数据

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

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

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

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

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

  1. rpoplpush key1 key2

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

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

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

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

  1. lindex key index

4.6 获得列表长度

  1. llen key

4.7 在value的后面插入newvalue

  1. linsert key before value newvalue

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

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

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

  1. lset key index value

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

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

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<String,Object>

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

在这里插入图片描述

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

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

5.1 添加/修改数据

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

5.2 获取数据

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

5.3 删除数据

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

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

  1. hsetnx key field value

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

  1. hmset key field1 value1 field2 value2

5.6 获取多个数据

  1. hmget key field1 field2

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

  1. hlen key

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

  1. hexists key field

5.9 列出该hash集合的所有field

  1. hkeys key

5.10 列出该hash集合的所有value

  1. hvals key

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

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

5.12 当field不存在时才添加field

  1. hsetnx key field value

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 添加数据

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

6.2 获取全部数据

  1. smembers key

6.3 删除一部分数据

  1. srem key member1 [member2]...

6.4 获取集合数据总量

  1. scard key

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

  1. sismember key member

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

  1. srandmember key [count]

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

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

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

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

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

  1. sinter key1 key2

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

  1. sunion key1 key2

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

  1. sdiff key1 key2

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

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

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 当中

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

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

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

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

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

包括等于 min 或 max 的元素

返回值按score从小到大排列

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

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

7.4 为元素的score加上增量 increment

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

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

  1. zrem key value

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

  1. zcount key min max

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

  1. zrank key value>

7.8 zset的数据结构

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

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

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

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

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

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

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

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

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

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

7.4 为元素的score加上增量 increment

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

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

  1. zrem key value

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

  1. zcount key min max

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

  1. zrank key value>

7.8 zset的数据结构

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

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

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

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

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

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

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

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

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

发表评论

表情:
评论列表 (有 0 条评论,9人围观)

还没有评论,来说两句吧...

相关阅读