一、基础知识
- 定义:redis是开源的、高性能的key-value存储系统,常被称为数据结构服务器。
- 数据类型:字符串(Strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)。
- 优点:
a. 性能极高:支持超过100k+每秒的读写频率
b. 丰富的数据类型
c. 原子操作
d.支持publish/subscribe、数据持久化、主从复制、快速的非阻塞首次同步、网络断开自动重连、通知、key过期、发布、管道、虚拟内存等特性
e.内存中数据集
f.丰富的客户端
二、基本操作
1. 终端操作
- 命令行终端查看redis
ps -ef | grep redis
- 通过端口号查看redis服务器状态
netstat -nlt | grep 6379
- 启动redis
redis-cli
redis-cli --raw #避免redis环境出现中文乱码情况
2. key相关操作
- exists检测key是否存在
- del删除指定key
- type查看key类型
- keys pattern匹配符合pattern的key
- randomkey返回随机key若数据库空则返回空
- rename重命名key,新名存在被覆盖
- renamenx在新名字存在时返回失败
- dbsize返回数据库键值数量
- expire指定key过期时间,单位秒
- ttl返回设置过期时间key的剩余过期秒数
- select通过索引选择数据库
- move将key移动到指定数据库
- flushdb删除当前数据库中所有key
- flushall删除所有数据库中key
(注意:多数操作成功返回1,失败返回0)
exists key
del key
type key
keys * #可以是正则表达式
3. strings操作
(补充:string可包含jpg、序列化对象、上限1G)
- set创建key的value
- setnx若key不存在则赋值
- get获取key对应的值
- getset设置key值并返回之前的value
- mget返回多个key对应的value
- mset一次设置多个key的value
- msetnx同上但不会覆盖已有值
- incr对key的value做 ++操作返回新值
- decr对key的value做 –操作返回新值
- incrby对key的value做 +指定值操作返回新值
- decrby对key的value做 -指定值操作返回新值
- append对给定key的value追加字符串并返回字符串长度
- getrange返回指定key的value的指定长度
(注意:若相应操作key不存在,一般返回nil)
4. lists操作
(补充:list实质是每个元素都是string的双向链表)
- push给列表插入值,range查看列表(l左、r右)
- lpush左插入
- rpush右插入
- lrange返回key的指定区间元素
- llen返回key对应的list长度
- ltrim截取list保留指定区间元素
- lset设置list中指定下标元素值
- lrem从list中删除count个和value相同的元素,count=0全部删除
- lpop从头部删除list元素
- rpop从尾部删除list元素
- blpop给定list删除元素,若所有给定list都为空则阻塞
- brpop同上
- rpoplpush从list尾部和删除元素并添加到指定list的头部
5. set操作
(补充:set是string的无序集合,最大包含2的32次方减1个元素)
- sadd添加一个string元素到set集合中
- srem从key对应的set中移除给定元素
- spop删除并返回key对应set中随机一个元素
- srandmember随机取set中一个元素但不删除
- smove从一个set中移除指定元素并添加到另一个set中
- scard返回set中元素个数
- sismemter判断元素是否在set中
- sinter饭hi给定key的交集
- sinterstore同inter但是会将交集存放到指定集合中
- sunion返回所有给定key的并集
- sunionstore同sunion并保存到指定集合中
- sdiff返回所有给定key的差集
- sdiffstore同sdiff并保存差集到指定集合
- smembers返回key对应的set中的所有元素,结果无序
6. sorted set操作
(补充:sorted set和set一样,不同是每个元素关联一个double类型的score,是skip list和hash table的混合体,利用score排序就可以有序获取集合中元素)
- zadd添加元素到集合
- zrem删除指定元素
- zincrby增加对应的值,并保持该集合有序
- zrank返回i指定元素在集合中的排名
- zrevrank同上,但集合中元素按score从大到小排序
- zrange取集合指定区间元素
- zrevrange同上,返回集合中score逆序
- zrangebyscore返回集合中score在给定区间的元素
- zcount返回集合中score在给定区间的数量
- zcard返回集合中元素个数
- zscore返回给定元素对应的score
- zremrangebyrank删除集合中排名在给定区间的元素
- zremrangebyscore删除集合中score在给定区间的元素
7. hash操作
(补充:hash是string类型的field和value的映射表,hash适合存储对象,占用更少内存方便存取整个对象)
- hset设置hash field为指定值
- hget获取指定的hash field
- hmget获取全部指定的hash field
- hmset同时设置hash的多个field
- hincrby将指定的hash field加上给定值
- hexists测试指定field是否存在
- hdel删除指定的hash field
- hlen返回指定的hash的field数量
- hkeys返回hash的所有field
- hvals返回hash的所有value
- hgetall返回hash的所有field和value
8. 持久化操作
(补充:redis是一个支持持久化的内存数据库,redis需要经常将内存中的数据同步到磁盘保证持久化)
- snapshotting(快照)
将内存中数据以快照方式写入二进制文件中,默认文件名为dump.rdb可以配置自动做快照持久化方式
save 900 1 #900秒内超过1个key被修改发起快照
save 300 10
- append-only file(aof)
比快照有更好的持久化性,redis将收到的写命令通过write追加到文件中默认appendonly.aof,当redis重启通过执行文件中保存的写命令来重建整个数据库内容,故非实时写入磁盘可能有部分丢失,可通过配置文件告诉redis通过fsync函数强制os写入磁盘的时机,三种方式:
appendonly yes #启用aof持久化方式
appendfsync always #每次收到写命令强制写入磁盘,最慢,保证完全的持久化
appendfsync everysec #每秒强制写入磁盘一次,折中
appendfsync no #完全依赖os,性能最好,持久化没保证
9. 主从复制
特点:
a. master可以有多个slave
b. 除多个slave连接到相同的master外,也可连接其他slave形成图状结构
c. 主从复制不阻塞master,当一个或多个slave与master进行初次同步数据master可继续出来client请求,反之不可以
d. 提高了系统的可伸缩性,可用做简单的数据冗余
f. 可以在master禁用数据持久化,在slave配置数据持久化
10. 发布订阅
pub/sub是消息通信模式,消息类型称为通道channel,消息传递是多对多的。
11. 管道
redis是cs模式的TCP server,一个client可以通过一个socket连接发起多个请求命令,请求发出后client通常被阻塞等待redis服务处理,并返回报文。pipeline方式将多个命令打包一起发送,无需等待单条命令的响应返回。
12. 虚拟内存
redis没有使用os提供的虚拟内存机制,而是自己实现了虚拟内存机制,将不常用数据交换到磁盘上,提高单台redis server的数据库容量,对性能造成影响不大。
13. redis应用场景
- 取最新N个数据的操作
- 排行榜应用,取top N操作(sorted set的score)
- 需要精准设定过期时间的应用(sorted set的score)
- 计数器应用(incr,decr)
- uniqe操作,获取某段时间所有数据去重(set)
- 实时系统,反垃圾系统(set)
- pub/sub构建实时消息系统
- 构建队列系统(list、sorted set)
- 缓存
版权声明:本文为weixin_48062951原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。