codis(下)
Codis 在程序中的使用
前两篇文章记录了codis的安装和启动,以及服务器集群的架设,这一篇记录一下codis在工程中的使用情况。
python测试程序
用python连接codis服务器的测试程序,测试了一些简单的命令和简单排行榜。连接的ip地址是codis组件中proxy的地址,proxy接受的命令并不是全部是redis命令,具体情况参考官方文档
(https://github.com/CodisLabs/codis/blob/release3.2/doc/unsupported_cmds.md)
import redis # 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库
r = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True) # host是redis主机,需要redis服务端和客户端都启动 redis默认端口是6379
#r.set('name2', 'warship3') # key是"foo" value是"bar" 将键值对存入redis缓存
# print(r['name2'])
# print(r.get('name2')) # 取出键name对应的值
# print(type(r.get('name2')))
#r.hmset("myhash",{"field1":"Hello","field2":"World"})
# r.zadd("499-rank-100",5,111)
# r.zadd("499-rank-100",2,112)
# r.zadd("499-rank-100",30,113)
# r.zadd("499-rank-100",10,114)
#ZRANGE myzset 0 -1 WITHSCORES
# print(type(r.zrange("499-rank-100",0,3,withscores=True)))
# print(r.zrange("499-rank-100",0,3,withscores=True))
# print(r.zrevrange("499-rank-100",0,3,withscores=True))
# print(r.zrevrank("499-rank-100",10))
print(r.zrevrange("1014-rank-4",0,100,withscores=True))
print(r.zrevrank("1014-rank-4",10))
项目中的实际使用
首先我们的项目在没有引入codis之前,所有的数据全部存储在mysql中,玩家摘要和排行榜这些请求量比较大的数据都是在程序初始化的时候全部加载到内存中的,引入codis后,需要把这些数据全部在codis中做一份拷贝(用python做这类工作非常效率,因为我们的mysql数据中每一张数据表都有一个modify_time字段,标识了该条数据的上一次修改时间,所以只要根据这个字段就可以在不停服的情况下做前期的数据拷贝,停服后只需要同步最后一点时间内修改的数据就好了),工程中使用这些数据的时候需要把mysql和codis中的数据同步更新,由于mysql的数据更可信,所以在mysql和redis的数据出现不匹配的情况下,选择mysql中的数据,而大量对摘要和排行榜数据的请求全部交给codis处理,这样不仅分离了项目主程序和摘要排行榜数据,也加快了读取这些数据的速度。
上线后codis的表现比较好,没有出现过什么问题,如果各个group的内存使用不太平均,还可以使用codis网页工具提供的功能对slot进行动态转移,把内存量使用大的group中的slot分配到其它group中。