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

一、数据库操作命令

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

1.1 测试是否连通

ping

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

1.2 切换数据库

select index

1.3 数据移动

move key db

1.4 显示数据总量

dbsize

1.5 数据清除

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

二、键操作命令

2.1 查看当前库所有key

keys *

2.2 删除指定key

立即删除:

del key

异步删除:

unlink key

2.3 获取key是否存在

exists key

2.4 获取key的类型

type key

2.5 更改key的名字

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

2.6 指定key的有效期

# 为当前key设置过期10秒的时间
expire key 10

# 为当前key设置过期10毫秒的时间
pexpire key 10

# 以Unix时间戳格式设置键的到期时间(不常用)
expireat key 1393840000

2.7 获取key的有效期

# 以秒为单位返回 key 的剩余过期时间
ttl key
# 以毫秒为单位返回 key 的剩余过期时间
pttl key

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

persist key

2.9 查询模式的使用

语法结构:

keys pattern

使用示例:

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

三、五大数据类型-string

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

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

3.1 添加/修改数据

set key value

3.2 获取数据

get key

3.3 删除数据

del key

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

setnx key value

3.5 添加/修改多个数据

mset key1 value1 key2 value2 …

3.6 获取多个数据

mget key1 key2 …

3.7 获取key对应value的长度

strlen key

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

append key value

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

# 将key中所储存的值加1(默认就是加1,因此不写就是加1)
incr key

# 将key中所储存的值加10
incrby key 10

# 将key中所储存的值加上指定的浮点数增量值
incrbyfloat key 9.9

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

# 将key中储存的数字值减1
decr key

# 将key中所储存的值减少指定值
decrby key 10

3.11 设置有效时间

# 设置键值的同时,设置过期时间(时间单位为秒)
setex key seconds value

# 设置键值的同时,设置过期时间(时间单位为毫秒)
psetex key milliseconds value

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

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

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

# getrange key 起始位置 结束位置
getrange key 0 3

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

# setrange key 起始位置 value
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 添加/修改数据

# 从左边插入数据
# 语法:lpush key value1 [value2] ……
lpush key 10 20 30

# 从左边插入数据
# 语法:rpush key value1 [value2] ……
rpush key 10 20 30

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

lpop key    # 从左侧弹出
rpop key    # 从右侧弹出

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

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

rpoplpush key1 key2

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

lrange key start stop

# 示例
# 0左边第一个,-1右边第一个,这就表示获取所有的意思
lrange mylist 0 -1

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

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

lindex key index 

4.6 获得列表长度

llen key

4.7 在value的后面插入newvalue

linsert key before value newvalue

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

lrem key count value

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

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

lset key index value 

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

# 在指定时间内 从左边移出并获取列表的第一个元素
blpop key1 [key2] timeout
# 在指定时间内 从右边移出并获取列表的第一个元素
brpop key1 [key2] timeout
# 在指定时间内 从source列表中取出最后一个元素,并插入到另外一个列表destination的头部
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 添加/修改数据

# key 是redis的键   field是hash中数据的键
hset key field value
# 示例
hset key name "张三"

5.2 获取数据

# 从key中取出 hash的键为field的值
hget key field

# 获取key中全部的hash数据
hgetall key

5.3 删除数据

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

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

hsetnx key field value

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

hmset key field1 value1 field2 value2 …

5.6 获取多个数据

hmget key field1 field2 …

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

hlen key

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

hexists key field

5.9 列出该hash集合的所有field

hkeys key

5.10 列出该hash集合的所有value

hvals key

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

# 这里的increment只能是整数
hincrby key field increment

# 这里的increment只能是浮点数
hincrbyfloat key field increment

5.12 当field不存在时才添加field

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

sadd key member1 [member2]...

# 示例:
asdd myset 9 8 7

6.2 获取全部数据

smembers key

6.3 删除一部分数据

srem key member1 [member2]...

6.4 获取集合数据总量

scard key

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

sismember key member

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

srandmember key [count]

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

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

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

# source 源集合的名称
# destination 目标集合的名称
# value源集合想要移动的值
smove source destination value

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

sinter key1 key2

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

sunion key1 key2

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

sdiff key1 key2

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

# 求两个集合的交集元素并存储到destination集合当中
sinterstore destination key1 key2

# 求两个集合的并集元素并存储到destination集合当中
sunionstore destination key1 key2

# 求两个集合的差集元素并存储到destination集合当中
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 当中

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

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

# WITHSCORES可加可不加,但是加了可以让分数一起和值返回到结果集
zrange key start stop [WITHSCORES]

# 示例:获取key中下边0-5之间的元素
zrange key 0 5 WITHSCORES

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 的成员

包括等于 min 或 max 的元素

返回值按score从小到大排列

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

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

7.4 为元素的score加上增量 increment

zincrby key increment value

# 示例
zincrby myzset 2 "one"		# 返回值是增加后的分数

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

zrem key value

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

zcount key min max

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

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

zincrby key increment value

# 示例
zincrby myzset 2 "one"		# 返回值是增加后的分数

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

zrem key value

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

zcount key min max

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

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的范围获取元素列表。

猜你喜欢

转载自blog.csdn.net/qq_44749491/article/details/128061624