分类:数据库

Netty模拟redis服务器

摘要 学习了一下redis的网络通信协议,准备用netty来模拟接受redis客户端发送过来的协议,进行简单的回复 Redis的客户端与服务端采用叫做 RESP(Redis Serialization Protocol)的网络通信协议交换数据,客户端和服务器通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 。客户端和服务器发送的命令或数据一律以 \r\n (CRLF)结尾。 RESP支持五种数据类型: 状态回复(status reply):以“+”开头,表示正确的状态信息,”+”后就是具体信息​,比如: 其实它真正回复的数据是:+OK\r\n 错误回复(error reply…

阅读全文 »

redis脚本实现分布式锁

redis被大量用在分布式的环境中,自然而然分布式环境下的锁如何解决,立马成为一个问题。例如我们当前的手游项目,服务器端是按业务模块划分服务器的,有应用服,战斗服等,但是这两个vm都有可能同时改变玩家的属性,这如果在同一个vm下面,就很容易加锁,但如果在分布式环境下就没那么容易了,当然利用redis现有的功能也有解决办法,比如redis的脚本。 redis在2.6以后的版本中增加了Lua脚本的功能,可以通过eval命令,直接在RedisServer环境中执行Lua脚本,并且可以在Lua脚本中调用Redis命令。 使用脚本的好处: 1.减少网络开销:可以把一些要批量处理的功能,发在一个脚本里面执…

阅读全文 »

Redis有多耐久还看fsync

redis提供了2中持久化方式,分别是: RDB方式:可以在指定的时间间隔内,生成数据集的时间点快照(point-in-time snapshot) AOF方式:全称(append-only file)AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。Redis 还 可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。 由于rdb方式是时间间隔内生成一次快照,所有它的耐久度是很低的; aof方式的耐久度得看redis多久将数据fsync到磁盘一次,有三种选项: 选项一:每次有新命令追加到 AOF…

阅读全文 »

redis存储对象

redis已经应用相当广泛了,但redis本身并没有直接存储对象的方法,我们可以通过转换对象的方式来存储对象。 大致总结了以下几种方案来存储对象: 方案一:序列化对象为二进制 使用redis的接口: 至于序列化方式,我们有很多种选择,比如:Java serialize,Protobuf,或者自己手动序列化都行 方案二:序列化对象为字符串 使用redis的接口: 序列化为字符串,我们也有很多选择:Json(Jackson,FastJson),Xml等方式 方案三:转换对象为Map 使用redis的接口: 将对象转成一个map: 将map转成java对象: 这种方式有一个优势:在更新对象的时候不需…

阅读全文 »

redis集群方案

单机 redis最主要的适用场景:少量数据存储,高速读写访问,数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能。 分布式 随着用户量的增长,数据量随之增长,大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿,这时候我们需要横向扩展,多台主机共同提供服务,既分布多个redis协同工作。大致有如下几种集群方案: 方案一:Redis官方集群方案Redis Cluster Redis Cluster由3.0版本正式推出,是一种服务器sharding技术,对客户端来说是完全透明的。 Redis Cluster中,Sharding采用slot(槽)的概念,一共分成1638…

阅读全文 »