码迷,mamicode.com
首页 > 其他好文 > 详细

Redis(一)

时间:2018-03-11 00:29:37      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:java

介绍:redis是使用内存存储的非关系型数据库;除了能存储普通的字符串键之外,还可以存储其他4种数据结构;既可以作为主数据库使用,也可以作为其他存储系统的辅助数据库;附加功能有发布订阅,主从复制,持久化等。

数据结构:

String:存储字符串或数字值;getsetdel

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执行多个命令时的性能;

在需要执行大量命令的情况下,为了通过一次性发送所有命令,来减少通信次数并降低延迟值,但是这些命令没有必要作为事务multiexec包围时,通过Pipeline流水线一次性发送,尽可能地减少应用程序与redis之间的通信往返次数。

键的过期时间:

EXPIRE key-name seconds让给定键在指定的秒数之后过期

持久化:

1. 快照持久化

BGSAVE命令(创建一个子进程去备份);如果系统发生崩溃,用户将丢失最近一次快照之后更改的所有数据。

SAVE命令;在快照完成前不响应其他命令,可以配置一个时间,超出时间后自动转为BGSAVE形式。

2. AOF只追加文件

将被执行的写命令写到AOF文件的末尾,以此来记录数据发生的变化;

写入频率选项:always(受硬盘性能限制),everysec(每秒写一次),no(人为决定)

缺陷:AOF文件会不断变大。占用硬盘空间,且还原时间长。

解决:BGREWRITEAOF命令(创建子进程),移除AOF文件中冗余命令,重写AOF文件。

复制:

主从复制,客户端向主服务器写入,从服务器实时得到更新;

从服务器连接一个主服务器时,主服务器会执行BGSAVE操作,创建一个快照文件,发送给从服务器;

从服务器也可以拥有自己的从服务器,形成主从链;

总结:

1. 使用复制和AOF持久化可以极大地保障数据安全

2. 在多个客户端同时处理相同的数据时,可以使用watchmultiexec等命令来防止数据出错

 


Redis(一)

标签:java

原文地址:http://blog.51cto.com/13580976/2084997

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!