Redis数据结构-string

Redis的一个客户端,支持多个操作系统


全局命令

查看所有键

  • keys命令会遍历所有键,时间复杂度O(n),线上保存了大量的键时,禁止使用
keys *

查看当前数据库中键的总数

  • 它时查询Redis内置的变量,的时间复杂度是O(1)
dbsize

查看某个键是否存在

exists key
----------------
> EXISTS key
0
> EXISTS java
1
  • 如果存在返回1,不存在返回0

删除键

del key [key...]
-----------------
> EXISTS java
1
> del java
1
> EXISTS java
0
-----------------
> set a 1
OK
> set b 2
OK
> set c 3
OK
> set d 4
OK
> del a b c d
4
  • 无论值是什么数据结构,del都可以删除
  • 返回删除成功的个数

键过期

对键添加过期时间,超时自动删除键。

expire key seconds
-----------------
> set hello world
OK
> expire hello 10
1
> ttl hello
3
> ttl hello
-2
  • 给hello设过期时间为10秒
  • ttl key 查看键的过期时间;返回-2,表示键已被删除

键的数据结构

type key
---------------
> set a b
OK
> type a
string
> rpush mylist a b c d
4
> type mylist
list
> type not_exist_key
none

数据结构与内部编码

Redis的5种数据结构,string,list,hash,set,zset,它们是提供给用户直接使用的数据结构。

每种数据结构内部都有不同的实现方式,也就是内部编码。比如string的内部编码有raw,int,embstr;list的内部编码有quicklist,linkedlist,ziplist。这样设计一方面方便改进内部编码,另一方面可以为不同的场景提供不同的实现。

查看内部编码

object encoding key
-------------------
> object encoding mylist
quicklist
> object encoding a
embstr

单线程架构

【专题todo Redis的单线程架构】

【专题todo IO多路复用】

单线程架构+IO多路复用

Redis是单线程的,所以每条命令从客户端到达服务端不会立刻被执行,而是进入一个队列中,然后被逐个执行,不会存在并发的问题。

单线程为什么还这么快?

  • 纯内存访问
  • 非阻塞IO,Redis使用epoll作为多路复用的实现,加上自身的事件处理模型将epoll的连接,读写,关闭都转换为事件,不在网络IO上浪费时间
  • 单线程避免了线程切换和竞争产生的消耗

单线程架构的问题就是如果某个命令执行时间过长,会造成其他命令的阻塞,是要重点关注的。

字符串

字符串是最基本的数据结构,字符串的值实际可以是字符串(简单的字符串,json,xml),数字(整数,浮点数),甚至是二进制(图片,音频,视频),但是值最大不超过512MB

设置值

set key value [ex seconds] [px milliseconds] [nx|xx]
-------------------------------------------------------
> set hello world
-------------------------------
选项说明:
ex seconds: 为键设置秒级过期时间
px milliseconds 为键设置毫秒级过期时间
nx:键必须不存在,才可以设置成功,用于添加
xx:键必须存在,才可以设置成功,用于更新

set xx的例子:

> exists hello
0
> set hello world xx
null
> set hello world
OK
> set hello redis xx
OK
> get hello
redis

与ex和nx类似的还有两个单独的命令:setex 和 setnx

setex key seconds value // 设置过期时间,秒级
setnx key value // 键不存在才能添加

setnx的例子:

> exists hello
0
> setnx hello world
1
> setnx hello world
0

由于Redis是单线程的命令处理机制,如果多个客户端同时执行setnx,那么只有一个客户端可以设置成功,所以setnx可以作为分布式锁的实现方案。

【专题todo 分布式锁】

获取值

get key

如果键不存在,返回空(null)

批量设置值

mset key value [key value ...]
-----------------------------------
> mset a 1 b 2 c 3 d 4
OK
> get a
1
> get b
2

批量获取值

mget key [key ...]
-------------------------
> mget a b c r d
1
2
3
null
4

返回的结果是和传入键的顺序一致的.

批量操作减少IO次数,但是要注意批量操作的数量过多可能会阻塞Redis或网络拥塞

计数

整数自增
incr key 
----------------
> incr akey  // 自增不存在的key,按照从0自增,返回1
1
> incr akey // value是整数,返回自增后的结果
2

> set hello world 
OK
> incr hello  // 值非整数,返回错误
ERR value is not an integer or out of range
整数自减
decr key
自增指定数字
incrby key increment
--------------------
> incrby key 2
2
自减指定数字
decrby key decrement
-------------------
> decrby key 2
1
自增浮点数
incrbyfloat key increment
--------------------------
> incrbyfloat key 1.1
2.1