使用python 结合mysql和redis进行缓存设计

基于Python操作Redis

1、 创建示例数据库表
CREATE TABLE tb_signin_rank(
id INT,
user_name VARCHAR(10) COMMENT '用户名',
signin_num INT COMMENT '签到次数',
signin_time DATETIME COMMENT '签到时间',
gold_coin INT COMMENT '金币'
);
初始化数据
INSERT INTO tb_signin_rank
VALUES(1, 'shouke', 0, NULL, 0),
(2, 'chuangke', 0, NULL, 0),
(3, 'ishouke', 0, NULL, 0),
(4, 'keshou', 0, NULL, 0),
(5, 'shouke', 0, NULL, 0);

 redis缓存键值设计
key  value
表名:主键值:列名   列值
或者如下,通过为不同列之间建立较为紧密的关联
key  value
表名:主键值:列值1:列名2   列值2

示例:把id1的人的签到次数(假设为5)存储到redis中则可如下操作:
set('tb_signin_rank:1:signin_num', 5)
 
这样做的好处是,类似数据库一样,通过主键便可获取其它值。
 
示例:把id和用户名关联
set('tb_signin_rank:shouke:id', 1)
 
这样,通过用户名就可以查询出关联的id了:uid = r.get("tb_signin_rank:%s:id" % username)
 
redis关联数据库的数据处理
 
不要求强一致实时性的读请求,都由redis处理
要求强一致实时性的读请求,由数据库处理

案例
if __name__=="__main__":
    # print ("yes")
    # c = CrazyRedis()
    # c.lpush("b","v")
    # print ("yes")
    #
    pool = redis.ConnectionPool(host=host, port=6379, db=0)
    r = redis.Redis(connection_pool=pool)
    try:
        dbconn = pymysql.connect(
            host="127.0.0.1",
            port=3306,
            user="root",
            password="123456",
            database='ooxx',
        )
    except Exception as e:
        print(u'初始化数据连接失败:%s' % e)
        sys.exit()

        # 执行签到
    try:
        print("id=====%s" % id)
        db_cursor = dbconn.cursor()
        print("id=====%s" % id)
        for id in range(1, 6):
            db_cursor.execute(
                'UPDATE tb_signin_rank SET signin_num = signin_num + 1, signin_time = NOW(), gold_coin = gold_coin + (1 + RAND()*9) WHERE id = %s',
                (id,))
            db_cursor.execute('commit')
        # 更新缓存
        print("id=====%s"%id)
        r.zincrby("tb_signin_rank:id:signin_num", id, 1)
    except Exception as e:
        print(u'执行数据库更新操作失败:%s' % e)
        db_cursor.execute('rollback')
        db_cursor.close()
        exit()

    # 展示用户签到次数
    for id in range(1, 6):
        result = r.zscore('tb_signin_rank:id:signin_num', id)
        if not result:  # 不存在缓存,从数据库读取
            print(u'----从数据库读取用户签到次数----')
            try:
                db_cursor = dbconn.cursor()
                db_cursor.execute('SELECT signin_num FROM tb_signin_rank WHERE id = %s', (id,))
                result = db_cursor.fetchone()[0]
                # 更新到缓存
                r.zadd('tb_signin_rank:id:signin_num', id, result)
            except Exception as e:
                print(u'执行数据库查询操作失败:%s' % e)
                db_cursor.close()
        else:  # 存在缓存,从缓存读取
            print(u'----从缓存读取用户签到次数----')
            result = int(result)

        print(u'sigin_num of user[id=%s]: %s' % (id, result))


    # 展示签到排行榜
    result = r.zrevrange('tb_signin_rank:id:signin_num', 0, 10)
    print(u'签到排行榜:')
    print(result)
结果打印:
    ----从缓存读取用户签到次数----
sigin_num of user[id=1]: 1
----从缓存读取用户签到次数----
sigin_num of user[id=2]: 1
----从缓存读取用户签到次数----
sigin_num of user[id=3]: 1
----从缓存读取用户签到次数----
sigin_num of user[id=4]: 1
----从缓存读取用户签到次数----
sigin_num of user[id=5]: 18
签到排行榜:
['1', '2', '3', '4', '5']

参考:http://blog.sina.com.cn/s/blog_13cc013b50102wb5w.html
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值