预备
redis全局命令
查看所有的键: keys *
键总数:dbsize
检查键是否存在:exists key
删除键:del key
键过期:expire key second,其中ttl 命令会返回键的剩余时间
键的数据结构类型:type key
数据结构和内部编码
type命令实际返回的是当前键的数据结构类型,他们分别是string,hash,list,set,zset但是这只是redis对外的数据结构.
实际上每种数据结构都有着自己的底层内部编码实现,而且是多种实现,这样redis会在合适的场景下选择合适的内部编码.
redis这样的实现有两种好处,
- 第一:可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发出更加优秀的内部编码,无需改动外部数据结构和命令
- 多种内部编码实现可以在不同场景下发挥各自的优势
单线程架构
redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务
redis客户端和服务端的调用会经历如下三个阶段:发送命令,执行命令,返回命令因为redis是单线程来处理命令的,所以一条命令从客户端到达服务端不会立即被执行,所有命令都会进入到一个队列中,然后逐个被执行,所以客户端命令执行的顺序是不确定的,但是可以确定不会有两条命令同时被执行
为什么单线程访问还能够这么快:
- 纯内存访问
- 非阻塞IO
- 单线程避免了线程切换和竞态产生的开销
单线程机制会带来很多的好处,但是对于每个命令的执行时间是有要求的,如果某个命令的执行时间过长,会造成其他命令的阻塞,所有redis是面向快速执行的场景设计的数据库
字符串
字符串类型是redis最基础的数据结构,首先键都是字符串类型的,而且其他几种数据结构都是在字符串类型的基础上构建的,所以字符串类型能够为其他四种数据结构的学习奠定基础,字符串类型的值可以是字符串,数字甚至是二进制文件,但是值最大不能超过512兆
常用命令
- 设置值:
set key value [ex|px] [nx|xx]
ex 为键设置秒级过期时间
px 为键设置毫秒级过期时间
nx 键必须不存在才能够设置成功,用于添加
xx 键必须存在,才能够设置成功,用于更新
setnx用于实现分布式锁:多个客户端同时执行setnx只有一个能够实现成功 - 获取值:
get key - 批量设置值
mset key value [key value … ] - 批量获取值
mget key [key …]
如果有些键不存在,那么他的值为空,结果是按照传入键的顺序返回
批量操作可以有效的提高开发效率,加入没有mget这样的命令,要执行n次get需要消耗大量的网络和硬件开销
学会使用批量操作,有助于提高业务执行效率,但是注意的是每次的批量操作所发送的命令数量是是有节制的,如果数量过多会造成redis阻塞或者网络阻塞 - 计数<