Redis
Remote Dictionary Server(远程字典服务器),是一个用C语言编写的,开源的,基于内存并支持持久化的,高性能NoSQL数据库.
Redis数据大部份时间都是存储内存中,适合存储频繁访问,数据量小的数据
Redis的特点
1. 支持数据持久化
Redis支持数据的持久化,可以将数据保存到磁盘中,重启的时候可以将数据再次加载进行使用
2.支持多种数据类型
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,hash,zset等数据结构的存储
3.支持数据备份
Redis支持数据的备份,即master-slave模式的数据备份
启动Redis服务:
- 前台启动
redis-server
- 后台启动
redis-server &
- 启动Redis服务时,指定配置文件
redis-server redis.conf &
关闭Redis服务
- 通过杀进程
ps -ef | grep redis
kill -9 pid
- 通过redis-cli命令关闭
redis-cli shutdown
Redis的客户端:用来连接redis服务,向redis发送命令,并且显示redis服务处理结果.
redis-cli:是Redis自带的客户端,使用redis-cli就可以启动redis客户端程序
redis-cli -h host -p port
退出客户端
exit
Redis基本知识
- 测试Redis服务的性能
redis-benchmark
- 查看redis是否正常,使用客户端连上Server,ping返回pong表示正常
ping
- 查看Redis服务器统计信息
info 全部信息
info [信息段] 查看Redis服务器指定的统计信息'
info Replication 集群
Redis的数据库实例:类似MySQL的数据库实例,Redis的数据库实例只能由Redis服务来创建和维护开发人员不能修改和创建数据库实例;默认情况下Redis会自动创建16个数据库实例,并且给这些数据库实例进行编号,从0开始,一直到15,使用编号来使用数据库;可以通过配置文件来指定Redis自动创建数据库的个数.Redis中每个数据库本身占用的内存空间,不会造成太多浪费.
Redis客户端默认登录是0号数据库,可以使用select index来切换数据库实例
select index
- 查看当前数据库实例中数据的条数,key的数量
dbsize
- 查看当前数据库实例中所有的key
keys *
- 清空数据库实例
flushdb
- 清空所有数据库实例
flushall
- 查看Redis中所有配置信息
config get *
config get parameter
Redis的五种数据结构
程序是用来处理数据的,Redis是用来存储数据的;程序处理完的数据要存储到redis中,不同特点的数据要存储在Redis中不同类型的数据结构中.
字符串: 单key-单value
list列表: 单key-多有序value
set集合: 单key-多无序value
zset: dankey-多有序value
hash: 单key-对象(属性:值)
1. 字符串类型string
字符串类型是Redis中最常用的数据类型,它能存储任何数据类型的数据,包括二进制数据,序列化后的数据,JSON化后的对象甚至是一张图片.最大512M
2. 列表类型
Redis列表是简单的字符串列表,按照插入顺序,元素可以重复.可以添加一个元素到列表的头部(左边)或者尾部(右边),底层是个链表结构
3.集合类型
Redis的set是string类型的无序无重复集合
4. 哈希类型 hash
hash是一个string类型的field和value的映射表,hash特别适合用于存储对象类型
5.有序集合
Redis有序集合zset和set一样也是string类型的集合,且不允许重复的成员.不同的是zset每个元素都会关联一个分数(分数可以重复),redis通过分数来为集合中的成员从小到大排序
Redis的常用操作命令
Redis的key的操作命令
- 查看数据库中的key
keys pattern
作用:查找所有符合模式的pattern的key.pattern可以使用通配符
通配符:
- *: 表示0或多个字符,例如:keys 查询所有的key keys p查找p打头的所有key
- ?: 表示单个字符;例如:wo?d,匹配word,wood
- [] :表示选择[]内的一个字符,例如wo[or]匹配word wood 不匹配world wooord
- 判断key在数据库中是否存在
- exists key存在返回1,不存在返回0
- exists key[key key key…]返回值是存在key的数量
exists key
- 移动指定数据到指定数据库实例
move key index
- 查看key的剩余生存时间
- 如果key没有设置生存时间,返回-1
- 如果key不存在返回-2
ttl key
- 设置key的最大生存时间
expire key seconds
- 查看指定key的数据类型
type key
- 重命名key
rename key newkey
- 删除key
del [key key key…] 返回实际删除key的数量
del key
Redis关于string类型的操作命令
- 将string类型的数据保存到redis中,如果key已经存在则覆盖原来的value
set key value
- 从redis中获取string类型的数据
get key
- 追加字符串
- 如果key存在,返回追加之后的字符串长度
- 如果key不存在,则新设置key-value
append key value
- 获取字符串长度
strlen key
- 将字符串数值进行加1运算
- 如果key存在,返回加1运算后的结果
- 如果key不存在,首先设置一个key,值初始化0,然后进行incr运算
- 要求key对应的value必须为数值,否则报错
incr key
- 将字符串数值进行减1运算
- 如果key存在,返回减1运算后的结果
- 如果key不存在,首先设置一个key,值初始化0,然后进行decr运算
- 要求key对应的value必须为数值,否则报错
decr key
- 将字符串数值进行加offset运算
- 如果key存在,返回加offset运算后的结果
- 如果key不存在,首先设置一个key,值初始化0,然后进行incrby运算
- 要求key对应的value必须为数值,否则报错
incrby key offset
- 将字符串数值进行减offset运算
- 如果key存在,返回减offset运算后的结果
- 如果key不存在,首先设置一个key,值初始化0,然后进行decrby运算
- 要求key对应的value必须为数值,否则报错
decrby key offset
- 闭区间获取字符串key中从startIndex到endIndex的字符组成的子字符串,从0开始,正下标表示自左向右,负下标表示自右向左,最右边 一个下标为-1
getrange key startIndex endIndex
- 用value覆盖从下标为startIndex开始的字符串
setrange key startIndex value
- 设置字符串的同时设置过期时间
setex key seconds value
- 设置string的数据到redis中,当key不存在时设置成功,否则放弃设置
setnx key value
- 批量设置string类型到redis
mset key1 value1 key2 value2...
- 批量获取string类型的shuju
mget k1 k2...
- 批量设置string类型到redis,当所有key都不存在时设置成功,有一个存在则全部放弃
msetnx k1 v1 k2 v2...
Redis关于list类型的操作命令
list:单个key对应多个有序value,最左侧是表头,最右侧是表尾
- 每一个元素都有下标,表头元素的下标是0,依次往后排序,最后一个元素下标是列表长度-1
- 每一个元素的下标又可以用负数表示,负下标表示从表尾计算,最后一个元素下标为-1
- 元素在列表中的顺序由放入顺序决定
- 将一个或者多个值依次插入列表的表头(左侧)
lpush key value [v1 v2 v3..]
- 获取指定列表指定区间内的元素
lrange key start stop
- 将一个或者多个值依次插入列表的表尾(右侧)
rpush key value [v1 v2 v3..]
- 从指定列表弹出表头(左侧)元素
lpop key
- 从指定列表弹出表尾(右侧)元素
rpop key
- 获取指定列表中指定下标的元素
lindex key index
- 获取指定列表的长度
llen key
- 移除指定列表中某一些数据 (和value值相同的元素)
- count>0从列表左侧移除count个跟value值相等的元素
- count<0从列表右侧移除count个跟value值相等的元素
- count=0从列表移除所有和value值相等的元素
lrem key count value
Redis关于set类型的操作命令
一个key对应多个无序无重复value
- 将一个或多个元素添加进set
- 如果已经存在则不添加,返回成功加入的元素个数
sadd key value [v1 v2 v3...]
- 获取指定集合中所有元素
smembers key
- 判断指定元素在指定set中是否存在
sismember key member
- 获取指定集合的长度
scard key
- 移除指定集合中一个或多个元素
srem key member[m1 m2 m3...]
- 随机获取指定集合中的一个元素
- count>0 从这个集合中随机获取count个元素,这多个元素不能重复
- count<0 从这个集合中随机获取count个元素,这多个元素可以重复
srandmember key [count]
- 随机从指定集合中移除一个或多个元素
spop key [count]
- 将指定集合中的指定元素移动到目标集合中
smove source dest target
- 获取一个集合中有其他集合中都没有的元素组成的新集合
求差集
sdiff key key [k1 k2 k3]
- 获取所有指定集合中都有的元素组成的新集合
求交集
sinter k [key1 key2 key3]
- 获取指定集合中,所有元素组成的集合
sunion key1 key2 key3...
Redis关于hash类型的操作命令
单key:
field-value
field-value
…
student:id-1
name-张三
age-20
- 将一个或多个filed-value对设置到hash中
hset key field-value[field-value...]
- 获取指定hash表中指定field的值
hget key field
- 批量将多个filed-value对设置到hash中
hmset key field-value[field-value...]
- 批量获取指定哈希表中多个field的值
hmget key field1 field2...
- 获取指定hash表中所有的field和value
hgetall key
- 从指定哈希表中删除一个或多个field
hdel key field [f1 f2]
- 获取指定hash表中field的个数
hlen key
- 判断指定hash表中是否存在某一field
hexists key field
- 获取指定哈希表中所有field的列表(类似hashmap的keyset)
hkeys key
- 获取指定hash表中所有的value的列表
hvals key
- 对指定哈希表中指定field值进行整数加法运算
hincrby key field int
- 对指定哈希表中指定field值进行浮点数加法运算
hincrbyfloat key field float
- 将一个filed-value对设置到hash中,如果已存在则设置失败
Redis配置文件
在redis根目录下提供redis.conf配置文件,可以配置redis服务端运行的一些参数
- 如果不使用配置文件,Redis按照默认参数运行
- 如果使用配置文件,在启动redis服务时必须指定所使用的配置文件
- redis配置文件中关于网络的配置
- port: 指定Redis服务所使用的端口,默认6379
- bind: 客户端连接Redis服务时,所能使用的ip地址,默认可以使用Redis服务所在主机上任何一个IP都可以;一般情况下,都会配置一个IP,而且通常是一个真实IP.
- 如果配置了port和bind,则客户端连接Redis服务时,必须指定端口和IP
redis-cli -h host -p port
redis-cli -h host -p port shutdown
- 常规配置
- loglevel: 配置日志级别.
- logfile: 指定日志文件.
- databases: Redis默认创建数据库实例个数
- 安全配置
requirepass password
protected-mode=yes
redis-cli -h host -p port -a password
Redis持久化策略
Redis是内存数据库,他把数据存到内存中,这样加快了读取速度的同时也带了数据的安全性问题,即当Redis服务器发生宕机后,Redis数据库里的数据将全部丢失.为了解决这个问题Redis提供了持久化功能—RDB和AOF(Append Only File)
RDB
RDB(Redis DataBase) 是Redis默认的持久化方案.在指定时间内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中.即在指定目录下生成一个dump.rdb文件.Redis重启会通过加载dump.rdb文件来恢复数据.
RDB原理
Redis会复制一个与当前进程一样的进程.新的进程的所有数据(变量,环境变量,程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程,来进行持久化
整个过程主进程是不进行任何I/O操作的,这就确保了极高的性能
如果需要大规模数据恢复,且对数据恢复的完整性不是非常敏感.那RDB方式要比AOF方式更加高效,RDB的缺点是最后一次持久化之后的数据可能丢失
save <seconds> <changes>
配置符合快照触发条件,即Redis在seconds秒内key改变了changes次,Redis把快照的数据保存到磁盘一次
默认策略如下:
如果要禁用掉Redis持久化功能,则把所有的save配置都注释掉
- dbfilename: 默认dump.rdb
- dir: 持久化路径
AOF
采用操作日志记录进行每一次写操作,每次Redis服务启动的时候,都会重新执行一遍操作日志的指令
效率低下,默认关闭
AOF 配置
- appendonly: 配置是否开启AOF,yes表示开启,no表示关闭,默认关闭
- appendfilename:AOF保存文件名
- appendsync:AOF异步化策略
- always:同步持久化,每一次发生数据变化会立刻写入到磁盘中,性能较差但是数据完整性较好(慢 安全)
- everysec:出厂默认推荐,每秒异步记录一次
- no: 不即时同步
Redis的事务
事务: 把一组数据库命令放在一起执行,保证原子性,要么同时成功要么同时失败
Redis的事务:允许把一组Redis命令放在一起,把命令进行序列化,然后一起执行,保证原子性
- multi : 用来标记一个事务的开启
//TODO
Redis消息发布订阅
Redis客户端订阅频道,消息的发布者往频道上发布消息,所有订阅此频道的客户端都能收到消息
- 消息的订阅
subscribe channel
- 消息的发布;可以将消息发布到指定频道
publish
- 订阅一个或多个频道的消息,频道支持通配符
psubscribe channel*
Redis集群
主从复制: 主机数据更新后根据配置和策略,自动同步到从机的master/slave机制,Master以写为主,Slave以读为主
Redis主从复制: 主少从多,主写从读,读写分离,主写同步复制到从
配置:
- 配从(库)不配主(库)
- 配从库: salveof 主库IP 主库端口
- 主写从读, 读写分离