Redis
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis相关的知识,希望对你有一定的参考价值。
介绍:redis是使用内存存储的非关系型数据库;除了能存储普通的字符串键之外,还可以存储其他4种数据结构;既可以作为主数据库使用,也可以作为其他存储系统的辅助数据库;附加功能有发布订阅,主从复制,持久化等。
数据结构:
String:存储字符串或数字值;get,set,del
List:可以有序地存储多个字符串;LPUSH,RPUSH(将元素推入列表左端,右端)LPOP,RPOP;LINDEX(获取列表在给定位置上的一个元素);LRANGE(用于获取列表在给定范围上的所有元素)
Set:可以无序地存储多个字符串;与list的区别是list可以存储多个相同的字符串;SADD添加;SREM移除;SISMEMBER检查一个元素是否已经存在于集合;
Hash(散列):可以存储多个键值对之间的映射;HSET,HGET;HGETALL;HDEL;
Zset(有序集合):也是存储多个键值对,是有序的;键被称为成员member,值被称为分值score;分值必须为浮点数;既可以根据成员访问元素,又可以根据分值以及分值的排列顺序访问元素;ZADD;ZRANGE;ZRANGEBYSCORE;ZREM
发布与订阅:
SUBSCRIBE;UNSUBSCRIBE;PUBLISH;PSUBSCRIBE;PUNSUBSCRIBE
事务:
一个客户端在不被其他客户端打扰的情况下执行多个命令;命令被MULTI命令和EXEC包围;所有命令被放到一个队列里面;最简单的方法就是把事务放到线程里执行;
WATCH命令:对键进行监视,直到用户执行EXEC命令的这段时间里,如果有其他客户端抢先对任何被监视的键进行替换,更新或删除等操作,当用户尝试执行EXEC命令时,事务将失败并返回一个错误;
Redis中并不会在执行watch命令时对数据进行加锁,只会在数据已经被其他客户端抢先修改的情况下,通知执行了watch命令的客户端。这种做法为乐观锁。目的是尽可能地减少客户端的等待时间。
非事务型流水线:
Redis执行事务的过程中,会延迟已入队的命令直到客户端发送EXEC命令;通过减少客户端与redis服务器之间的网络通信次数来提升redis执行多个命令时的性能;
在需要执行大量命令的情况下,为了通过一次性发送所有命令,来减少通信次数并降低延迟值,但是这些命令没有必要作为事务被multi和exec包围时,通过Pipeline流水线一次性发送,尽可能地减少应用程序与redis之间的通信往返次数。
键的过期时间:
EXPIRE key-name seconds让给定键在指定的秒数之后过期
持久化:
1. 快照持久化
BGSAVE命令(创建一个子进程去备份);如果系统发生崩溃,用户将丢失最近一次快照之后更改的所有数据。
SAVE命令;在快照完成前不响应其他命令,可以配置一个时间,超出时间后自动转为BGSAVE形式。
2. AOF只追加文件
将被执行的写命令写到AOF文件的末尾,以此来记录数据发生的变化;
写入频率选项:always(受硬盘性能限制),everysec(每秒写一次),no(人为决定)
缺陷:AOF文件会不断变大。占用硬盘空间,且还原时间长。
解决:BGREWRITEAOF命令(创建子进程),移除AOF文件中冗余命令,重写AOF文件。
复制:
主从复制,客户端向主服务器写入,从服务器实时得到更新;
从服务器连接一个主服务器时,主服务器会执行BGSAVE操作,创建一个快照文件,发送给从服务器;
从服务器也可以拥有自己的从服务器,形成主从链;
总结:
1. 使用复制和AOF持久化可以极大地保障数据安全
2. 在多个客户端同时处理相同的数据时,可以使用watch,multi,exec等命令来防止数据出错
以上是关于Redis的主要内容,如果未能解决你的问题,请参考以下文章