)
1、redis简介redis是NoSQLNot Only SQL:非关系型数据库常见的非关系型数据库有MongoDB、Redis、Memcache。Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存、持久化的日志型、Key-Value数据库并提供多种语言的API。支持的数据类型String字符串、hash哈希、list列表、set集合和zsetsorted set 有序集合。这些都支持push/pop、add/remove以及交集并集和差集等操作。redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件并且在此基础上实现了master-slave主从同步。Redis的所有数据都是保存在内存中然后不定期的通过异步方式保存到磁盘上半持久化模式也可以把每一次数据变化都写入到一个append only fileaof里面全持久化模式。由于Redis的数据都存放在内存中如果没有配置持久化redis重启后数据就全丢失了于是需要开启redis的持久化功能将数据保存到磁盘上当redis重启后可以从磁盘中恢复数据。redis提供两种方式进行持久化一种是DRB持久化原理是将redis在内存中的数据库记录定时dump到磁盘上的RDB持久化,另外一种是AOFappend only file持久化原理是将Redis的操作日志以追加的方式写入文件。2、Redis常用的命令ping :测试redis数据库是否连接成功 set a 12 :表示a为键存储一个值为12 keys * :查看当前所有库的key exists key :判断某个key是否存在 type key : 查看key是什么类型 del key 删除指定的key数据 unlike key 根据value删除非阻塞删除。 expire key 10 指定key的有效期为10秒 ttl key 查看指定的key还有多少秒过期-1表示永不过期 select dbindex 切换数据库 默认为0 flushdb 清空当前数据库 flushall 清空全部数据库1、String字符串类型set key value设置键值对的get key 获取键得到对应的值append key newValue往key中追加值。strlen key查看键的长度。incr/decr原子递增/递减1incrby/descrby递增或递减指定的数字mset key value key value 可以同时设置多个键值对mget key key 可以同时得到键的值getrange获取值的范围 getrange key start end;setrange key 起始位置 value 覆盖指定位置的值getsetkey value 以新换旧设置新值的同时返回旧值。2、List列表redis列表是简单的字符串列表按照插入排序可以添加一个元素到列表的头部左边或者尾部右边他的底层是使用的双向链表实现的对两端的操作性能很高。通过索引下标操作组件节点性能会比较差。lpush/rpush从左边或者右边插入一个或多个值。lrange key start stop 从列表左边获取指定范围内的值lpop/rpop key count 从左边或者右边弹出多个元素count可以省略 默认值为1。lpop/rpop 操作之后弹出的值会从列表中删除如果列表内的值全部弹出则键将被删除。llen key获取列表长度linsert在某个值的前面或后面插入一个值linsert key before|after value newvalue3、发布和订阅redis的发布和订阅pub/sub是一种消息通信模式发布者发布消息订阅者接受消息redis客户端可以订阅任意数量的频道。subscrible订阅一个或者多个频道subscrible channel [channel1.....]publish发布消息到指定的频道publish channel messagepsubscribe可以支持通配符来订阅多个符合给定模式的频道psubscrible pattern [pattern.....] 可能会遇到*通配符4、事务和锁redis的事务是一个单独的隔离操作事务中的所有命令都会序列化按顺序的执行事务在执行的过程中不会被其他客户端发来的命令请求所打断。redis事务的主要作用就是串联多个命令防止别的命令插队。Multi、Exec 、Discard从输入Multi命令开始输入的命令都会依次进入命令队列中但不会执行直到输入Exec后redis会将之前的命令依次执行。组队的过程中可以通过discard来放弃组队。redis事务分为2个阶段组队阶段和执行阶段组队阶段只是将所有命令加入命令队列执行阶段依次执行队列中的命令在执行这些命令的过程中不会被其他客户端发送的请求命令插队或打断。multi标记一个事务块的开始事务块内的多条命令会按照先后顺序放进一个队列中最后有exec命令原子性atomic地执行。乐观锁Optimistic Lock顾名思义就是很乐观每次去拿数据的时候都会认为别人不会修改所以不会上锁但是在修改的时候会判断一下再次期间别人有没有去更新这个数据可以使用版本号等机制。乐观锁适用于多读的应用类型这样可以提高吞吐量。redis就是使用这种check-and-set机制实现事务的。redis默认支持乐观锁机制。unwatch取消监视取消WATCH命令对所有key的监视如果在执行WATCH命令之后EXEC命令或DISCARD命令先被执行了的话那么就不需要再执行UNWATCH了因为exec命令会执行事务因此watch命令的效果已经产生了而discard命令在取消事务的同时也会取消所有对key的监视因此这两个命令执行之后就没有必要执行unwatch了。redis事务的三大特征1、单独的隔离操作。事务中的所有命令都会序列化按顺序的执行事务在执行过程中不会被其他客户端发送来的命令请求所打断。2、没有隔离级别的概念队列中的命令没有提交exec之前都不会实际被执行因为事务提交前任何指令都不会被实际执行。3、不能保证原子性事务中如果有一条命令执行失败后续的命令任然会被执行没有回滚如果在组队阶段有1个失败了后面年都不会成功如果在组队阶段成功了在执行阶段有那个命令失败就这条失败其他的命令则正常执行不保证都成功或都失败。5、持久化1、触发PDB备份save用来配置备份的规则save的格式save 秒钟 写操作次数默认是1分钟内修改1万次或5分钟内需要修改10次或30分钟修改1次。手动执行命令备份savebgsave、flushall有三个命令可以触发备份。savesave时只管保存其他不管全部阻塞手动保存 不建议使用bgsaveredis会在后台异步进行快照操作快照同时还可以相应客户端情况。可以通过lastsave命令获取最后一次成功生成快照的时间。flushall执行flushall命令也会产生dump.db文件但里面是空的无意义。优势适合大规模数据恢复、对数据完整性和一致性要求不高更适合使用、节省磁盘空间、恢复速度快。2、AOP以日志的形式来记录每个写操作增量保存将redis执行过的所有写指令记录下来读操作不记录只允许追加文件但不可改写文件redis启动之初会读取该文件重新构造数据换言之redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。AOF持久化流程1、客户端的请求写命令会被append追加到AOF缓冲区内2、AOF缓冲区会根据AOF持久挂策略【always,everysec,no】将操作sync同步到磁盘的AOF文件中3、AOF文件大小超过重写策略或手写重写时会对AOF文件进行重写rewrite压缩AOF文件容量4、redis服务器重启时会重新load加载AOF文件中的写操作达到数据恢复的目的。AOF默认不开启 可以在redis.conf文件中进行配置。appendonly on # yes是开启no是关闭默认为no。 appendfilename appendonly.aof # aof文件名称默认为appendonly.aof dir ./ # aof文件所在目录当AOF和RDB同时开启系统默认取AOF的数据数据不会存在丢失AOF的备份机制和性能虽然和RDB不同但是备份和恢复的操作同RDB一样都是拷贝备份文件需要恢复时再拷贝到Redis工作目录下启动系统即加载。AOF同步频率设置1、appendfsync always每次写入立即同步始终同步每次redis的写入都会like记入日志性能较差但数据完整性比较好。2、appendfsync everysec每秒同步每秒记录日志一次如果宕机本地数据可能丢失更新的命令会放在内存中AOF缓冲区每秒将缓冲区的命令追加到AOF文件3、appendfsync no不主动同步redis不主动进行同步把同步交给操作系统。