点击关注公众号,k8s优秀车间主任及时送达
Redis 概况
- Redis 是一个开源的 key-value 存储系统。
- 和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、
- list(链表)、set(集合)、zset(sorted set --有序集合)和 hash(哈希类型)。
- 这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,
- 而且这些操作都是原子性的。
- 在此基础上,Redis 支持各种不同方式的排序。
- 与 memcached 一样,为了保证效率,数据都是缓存在内存中。
- 区别的是 Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记
- 录文件。
- 并且在此基础上实现了 master-slave(主从)同步。
- Redis默认启动端口6379。
- Redis 默认有16个数据库,类似数组下标从0开始,初始默认用0号库。
官方概况
Redis优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis 基础命令
select
select 命令用于切换数据库,格式:select<dbid>。如:
redis-cli
redis-cli 是redis的客户端命令
直接在shell中输入redis-cli即可。如:
dbsize
dbsize查看当前数据库的key的数量。如:
flushdb
flushdb 清空当前数据库。如
flushall
通杀全部数据库。
keys *
keys * 查看当前数据库所有key (匹配:keys *1)。如:
exists
exsits <key> 判断某个key是否存在,如果key值不存在则返回值为0,存在返回值为1。如:
type
type <key>查看你的key什么类型。如:
del
del <key> 删除指定key 数据。如:
unlink
unlink <key> 根据value 选择非阻塞删除,仅将 keys 从 keyspace 元数据中删除,真正的删除会在后续异步操作。
expire
expire <key> 10 10 秒钟:为给定的 key 设置过期时间。如:
ttl key
ttl key 查看还有多少秒过期,-1 表示永不过期,-2 表示已过期。如:
Redis字符串(String)
- String 是 Redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
- String 类型是二进制安全的。意味着 Redis 的 string 可以包含任何数据。比如 jpg 图片 或者序列化的对象。
- String 类型是 Redis 最基本的数据类型,一个 Redis 中字符串 value 最多可以是 512M。
字符串常用命令
set
set <key><value> 设置指定key 的值。如:
- NX:当数据库中 key 不存在时,可以将 key-value 添加数据库
- XX:当数据库中 key 存在时,可以将 key-value 添加数据库,与 NX 参数互斥
- EX:key 的超时秒数
- PX:key 的超时毫秒数,与 EX 互斥
get
get <key> 查询对应键值。如:
append
append <key><value>,将指定的 value 追加到该 key 原来值(value)的末尾。如:
strlen
strlen <key>获得值的长度。如:
setnx
setnx <key><value> 只有在 key 不存在时 设置 key 的值。如:
incr
incr <key>将 key 中储存的数字值增 1 只能对数字值操作,如果为空,新增值为 1。如:
decr
decr <key> 将 key 中储存的数字值减 1 只能对数字值操作,如果为空,新增值为-1。如:
incrby
incrby key increment将 key 中储存的数字值增减。自定义步长。如:
原子性
所谓原子操作是指不会被线程调度机制打断的操作;
这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另 一个线程)。
- 在单线程中, 能够在单条指令中完成的操作都可以认为是"原子操作",因为中 断只能发生于指令之间。
- 在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。Redis 单命令的原子性主要得益于 Redis 的单线程。
案例:
java 中的 i++是否是原子操作?不是 i=0;两个线程分别对 i 进行++100 次,值是多少?2~200
mset
mset 命令用于同时设置一个或多个 key-value 对。如:
msetnx
msetnx同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在,原子性,有一个失败则都失败。如:
getrange
Getrange 命令用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。如:
setrange
Setrange 命令用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始。如:
setnx
Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。如:
getset
Getset 命令用于设置指定 key 的值,并返回 key 的旧值。如:
数据结构
String 的数据结构为简单动态字符串(Simple Dynamic String,缩写 SDS)。是可以 修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式 来减少内存的频繁分配。
如图中所示,内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次 只会多扩 1M 的空间。需要注意的是字符串最大长度为 512M。