Redis
key-value存储系统,是跨平台的非关系型数据库,数据结构服务器,因为值可以是字符串、哈希、列表、集合和有序集合等类型。
redis简介
- 完全开源、遵守BSD协议,是一个高性能的key-value数据库
- 与其他key-value缓存产品的区别
- 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
- 不仅仅支持key-value类型的数据,同时还提供list set zset hash等数据结构的存储
- 支持数据的备份 master-slave数据的备份
redis配置
redis.conf 是redis的配置文件 可以通过CONFIG命令查看或设置配置项
#查询
CONFIG GET CONFIG_SETTING_NAME
#修改
CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
配置项说明
配置项 | 说明 |
---|---|
daemonize no | 守护进程的方式启动 使用yes启用守护进程 |
port 6379 | 监听端口 |
bind 127.0.0.1 | 绑定的主机地址 |
timeout 300 | 当客户端闲置多长后关闭连接 指定为0 表示关闭该功能 |
loglevel notice | 指定日志等级 rebug verbose notice warning 默认为notice |
databases 16 | 设置数据库的数量 默认数据库为0 |
requirepass foobare | 设置redis连接密码,如果配置了连接密码 连接redis时需要提供密码 |
maxclients 128 | 同一时间客户端的连接数 默认无限制 |
数据类型
-
string 字符串 一个key最大能存储512M
SET TestKey "this is a testKey" GET TestKey DEL TestKey
-
hash 哈希 每个hash可以存储2^32 - 1 键值对
HMSET testHashKey field1 "Hello" field2 "World" HGET testHashKey field1 HGET testHashKey field2
-
list 列表 按照插入顺序排序,可以添加一个元素到列表的头部或者尾部 最多可以存储2^32 -1元素
lpush testListKey redis #左侧插入元素 lpush testListKey mongodb lpush testListKey rabbitmq rpush testListKey mysql # 右侧插入原色 lrange testListKey 0 10 # 取list的元素
-
set 集合 是string类型的无序集合 集合是通过哈希表实现,添加、删除、查找复杂度都是o(1)
sadd testSetKey member # 集合内的元素时唯一的 第二次插入的元素将被忽略 smembers testSetKey
-
zset 有序集合 每个元素都会关联一个double类型的分数,redis正是通过分数为集合中的成员进行从大到小的排序,zset的成员是唯一的,但分数score却可以重复
zadd testZSetKey score member zrangebyscore testZScoreKey 0 10000
命令
- 启动redis客户端 redis-cli 启动后可以输入PING 检测redis服务是否启动 --raw 可以避免中文乱码
- 在远程服务上执行命令 redis-cli -h host -p port -a password
键
- DEL key 在key存在时删除key
- DUMP key 序列化指定的key 并返回序列化的值
- EXISTS key 检测指定的key是否存在
- EXPIRE key seconds 指定的key设置过期时间 以秒计
- EXPIREAT key timestamp 指定的key设置过期时间戳
- PEXPIRE key milliseconds 设置key的过期时间以毫秒计
- PEXPIREAT key milliseconds-timestamp 设置key的过期时间戳以毫秒计
- KEYS pattern 查找所有符合给定模式的pattern的key
- MOVE key db 把当前数据库的key移动的指定的数据库db中
- PERSIST key 移除key的过期时间 key将持久保持
- PTTL key 以毫秒为单位返回key的剩余的过期时间
- TTL key 以秒为单位,返回key的过期时间
- RANDOMKEY 从当前数据库中随机返回一个key
- RENAME key newKey 修改key的名称
- RENAMENX key newKey 仅当newkey不存在时,将key改名为newKey
- TYPE key 返回key所存储的值的类型
字符串
- SET key value 设置指定的key的值
- GET key 获取指定的key
- GETRANGE key start end 返回key中字符串值的子字符
- GETSET key value 将给定的key的值设为value,并返回key的旧值
- GETBIT key offset 对key所存储的字符串值,获取指定偏移量上的位
- MGET key1 [key2 …] 获取一个或者多个指定的key的值
- STRLEN key 返回key所存储的字符串的长度
- MSET key value [key value …] 同时设置一个或多个key-value对
- MSETNX key value [key value…] 同时设置一个或多个key-value对 当且仅当所有的key都不存在
- INCR key 将key中存储的数字值增1
- INCRBY key increment 将key所存储的值加上给定的增量值
- INCRBYFLOAT key increment 将key所存储的值加上给定的浮点增量值
- DECR key 将key中存储的数字值减一
- DECRBY key decrement 将key所存储的值减去给定的减量值
- APPEND key value 如果key已经存在并且是一个字符串,APPEND将指定的value追加到key原值末尾
哈希 hash
- HDEL key field1 [field2] 删除一个或对个hash表字段
- HEXISTS key field 检查哈希表key中,指定的字段是否存在
- HGET key fild 获取存储在哈希表中指定字段的值
- HGETALL key 获取在哈希表中指定key的所有字段和值
- HKEYS key 获取哈希表中的字段
- HVALUES key 获取哈希表中的所有值
- HLEN key 获取哈希表中字段数量
- HSET key field value 将哈希表中的key的字段field的值设为value
- HMGET key field1 [field2] 获取所有给定字段的值
- HMSET key field1 value1 [field2 value] 将多个field-value对设置到哈希表中
- HSETNX key field value 只有当field不存在时,设置哈希表字段的值
列表list
- BLPOP key [key2] timeout 移出并获取列表的第一个元素
- BRPOP key1[key2] timeout 移出并获取列表的最后一个元素
- LINDEX key index 通过索引获取列表中的元素
- LINDEX key BEFORE | AFTER pivot value 在列表的元素前或者后插入元素
- LLEN key 获取列表长度
- LPOP key 移出并获取列表的第一个元素
- LPUSH key value1 [value2] 将一个或多个元素插入到列表头部
- LPUSHX key value 将一个值插入到已存在的列表头部
- LRANGE key start stop 获取类表指定范围内的元素
- LREM key count value 移出列表元素
- LSET key index value 通过索引设置列表元素的值
- LTRIM key start stop 对一个列表进行修剪, 只保留指定区间内的元素,不在指定区间内的元素将被移除
- RPOP key 移除列表的最后一个元素 返回值为移除的元素
- RPUSH key value1 [value2] 在列表中添加一个或多个值
- RPUSHX key value 为已存在的列表添加值
集合Set
- SADD key member1 [member2] 向集合添加一个或多个成员
- SCARD key 获取集合的成员数
- SDIFF key1 [key2] 返回第一个集合与其他集合之间的差异
- SDIFFSTORE destination key1 [key2] 返回给定所有集合的差异并存储在destination中
- SINTER key1 [key2] 返回给定的所有集合的交集
- SINTERSTORE destination key1 [key2] 返回给定的集合的交集并存储在destination中
- SISMEMBER key member 判断member元素是否是集合的key的成员
- SMEMBERS key 返回集合中的所有成员
- SMOVE source destionation member 将member元素从source集合移动到destination集合
- SPOP key 移除并返回集合中的一个随机元素
- SRANDOMMEMBERS key [count] 返回集合中的一个或者多个元素
- SREM key member2 [member2] 移除集合中的一个或多个元素
- SUNION key1 [key2] 返回所有给定集合的并集
- SUNIONSTORE destination key1 [key2] 所有给定集合的并集存储在destination集合中
有序集合
- ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员 或更新已存在的成员的分数
- ZCARD key 获取有序集合的成员数
- ZCOUNT key min max 计算有序集合中指定区间的分数的成员数
- ZINCRBY key increment member 有序集合中对指定的成员分数加上增量increment
- ZINTERSTORE destination numkeys key [key …] 计算交集并将结果存储在新的有序集合的destination中
- ZLENCOUNT key min max 在有序集合中计算指定字典区间内成员数量
- ZRANGE key start stop [WHITSCORES] 通过索引区间返回有序集合指定区间内的成员
- ZRANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员
HyperLogLog
- PFADD key element [element] 添加指定元素到HyperLogLog中
- PFCOUNT key [key] 返回给定HyperLogLog的基数估算值
- PFMERGE destKey sourceKey [sourceKey] 将多个HyperLogLog合并为一个HyperLogLog
发布与订阅
- PSUBSCRIBE patten 订阅一个或多个符合给定模式的频道
- PUBSUB subcommand [argument [argument]] 查看订阅与发布系统状态
- PUBLIST channel message 将信息发送到指定的频道
- PUNSUBCRIBE channel [channel …] 退订频道
- SUBSCRIBE channel [channel …] 订阅一个或多个频道
事务
单个redis命令执行是原子性的,但redis没有在事务上增加任何维持原子性的机制,所以redis事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做的指令回滚,也不会造成后续的指令不做
- DISCARD 取消事务
- EXEC 执行所有事务块内的命令
- MULTI 标记一个事务块的开始
- UNWATCH 取消watch命令对所有key的监视
- WATCH key 监视一个key 如果在事务执行之前这个key被其他命令所改动,那么事务将被打断
redis连接
- AUTH password 验证密码是否正确
- ECHO message 打印字符串
- PING
- QUIT 关闭当前连接
- SELECT index 切换到指定的数据库
服务器
服务器命令主要用于管理redis服务
- BGREWRITEAOF 异步执行一个AOF 文件重写操作
- BGSAVE 在后台异步保存当前数据库的数据到磁盘
- CLIENT kill [ip:port] [id client-id] 关闭客户端的连接
- CLIENT list 获取连接到服务器的客户端连接列表
- CLIENT GETNAME 获取连接到服务器的客户端连接列表
- CLIENT SETNAME connect-name 设置当前连接的名称
- COMMAND 获取redis命令详细数组
- COMMAND COUNT 获取redis命令总数
- TIME 返回当前服务器时间
- CONFIG REWRITE 对启动redis服务器时所指定的redis.conf配置文件进行改写
- DBSIZE 返回当前数据库的key的数量
- FLUSHALL 删除所有数据库的所有key
- FLUSHDB 删除当前数据库的key‘
- LASTSAVE 返回最近一次redis成功数据保存到磁盘上的时间
- MONITOR 实时打印redis服务器接收到的命令
- SAVE 同步保存数据到磁盘
数据持久化
- SAVE 创建当前数据的备份 该命令将在redis的安装目录中创建dump.rdb文件
- 如果需要恢复数据,只需将dump.rdb文件移动到redis的安装目录并启动服务。
- 可以通过CONFIG GET dir来查看安装目录
- BGSAVE 该命令在后台备份文件
Redis安全
- 可以通过redis配置文件设置密码参数,客户端连接到redis服务器就需要密码验证。这样redis服务更安全
- CONFIG GET requirepass 查看是否设置了密码
- CONFIG SET requirepass设置新的密码,客户端连接服务就需要密码验证
- AUTH password 进行密码验证
Redis性能测试
- redis-benchmark 命令是在redis的目录下执行,非redis客户端的内部指令
- redis-benchmark - n 10000 -q 同时执行10000个请求来检测性能
- redis-benchmark -h 127.0.0.1 -p 6379 -t set, lpush -n 10000 -q