redis mysql_redis和mysql的结合示例[通俗易懂]

redis mysql_redis和mysql的结合示例[通俗易懂]mysql和redis的区别mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。redis是非关系型数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限django中使用mysql的方法通过继承models.Model来生成数据库表,详情见Django模型的使用。django中使用redis的方法首先安装python库pip3i…

大家好,又见面了,我是你们的朋友全栈君。

mysql和redis的区别

mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。

redis是非关系型数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限

django中使用mysql的方法

通过继承models.Model来生成数据库表,详情见Django模型的使用。

django中使用redis的方法

首先安装python库

pip3 install django-redis

在settings.py中增加如下代码

CACHES = {

‘default’: {

‘BACKEND’: ‘django_redis.cache.RedisCache’,

‘LOCATION’: ‘redis://127.0.0.1:6379’,

“OPTIONS”: {

“CLIENT_CLASS”: “django_redis.client.DefaultClient”,

“CONNECTION_POOL_KWARGS”: {“max_connections”: 100}

},

},

}

REDIS_TIMEOUT=7*24*60*60

CUBES_REDIS_TIMEOUT=60*60

NEVER_REDIS_TIMEOUT=365*24*60*60

在业务逻辑代码中加入

from django.core.cache import cache

此后,就可以通过

cache.set(key,value)

进行键值对的存储。通过

cache.get(key)

进行键值对的查询。

问题实例

在笔者实现的弹幕系统中,每一个发送到服务器的弹幕都要判断其所对应的活动是否接受图片弹幕。是否接受图片弹幕,原先存储在mysql的活动表中。但是每次发送弹幕都要从mysql中查询一次其所属的活动会降低系统的性能,同时总活动数(相对于弹幕数量)较少,适合将其存到redis中。

由于mysql和redis中都会维护活动的相关信息,因此在增删改查时需要保证数据的一致性。

考虑到请求的种类特点,此处采用了一种较为简洁的策略:

由于发送弹幕的请求数量较多,而每次发送弹幕是都需要查询活动信息,因此活动信息直接从redis查询得到。

由于修改活动信息的请求数量较少,不妨每次修改活动信息时会同时修改redis和mysql中的活动信息,从而保证了数据的一致性。

具体代码如下

def read_from_cache(attribute, id):

”’

从内存中读取数据库字段

:param attribute: 属性名

:param id: 数据库记录的id

:return:

”’

key = attribute + ‘_’ + str(id)

value = cache.get(key)

if value is None:

data = None

else:

data = json.loads(value)

return data

def write_to_cache(attribute, id, value):

”’

向内存中写入数据库字段

:param attribute: 属性名

:param id: 数据库记录id

:param value: 写入的值

:return:

”’

key = str(attribute) + ‘_’ + str(id)

cache.set(key, json.dumps(value), settings.NEVER_REDIS_TIMEOUT)

def get_activity_attribute(activity_id, attribute_name):

”’

从内存中读取与活动相关的属性

:param activity_id: 活动id

:param attribute_name: 属性名

:return: 返回值。如果没有找到,返回None

”’

data = read_from_cache(“activity_”+attribute_name, activity_id)

if data is not None: #如果能在内存中查到

print(“在内存中找到”, “属性名=”+attribute_name, “id=”,activity_id,”value=”, data)

return data #则直接返回

activities = Activity.objects.filter(id=activity_id) # 否则在数据库中进行查找

if len(activities) == 0:

return None

try:

data = activities.values(attribute_name)

data = data[0][attribute_name]

write_to_cache(“activity_” + attribute_name, activity_id, data)

return data

except:

return None

def set_activity_attribute(activity_id, attribute_name, value):

”’

向内存中写入与活动相关的信息

:param activity_id: 活动id

:param attribute_name: 属性名

:param value: 值

:return: 是否设置成功

”’

activities = Activity.objects.filter(id=activity_id) # 首先写到数据库中

if len(activities) == 0:

return False

setattr(activities[0], attribute_name, value)

activities[0].save()

write_to_cache(“activity_”+attribute_name, activity_id, value) # 然后在内存中更新相应字段

return True

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151200.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python爬虫实例大全

    python爬虫实例大全WechatSogou [1]- 微信公众号爬虫。基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典。DouBanS

    2022年7月3日
    32
  • 物联网之Zigbee系统开发一(zigbee简介)[通俗易懂]

    zigbee简介:无线传感网络的无线通信技术可以采用zigbee,蓝牙,wifi和红外等。ZigBee技术是一种短距离,低复杂度,低功耗,低成本,低数据速率的双向无线通信技术,是一组基于IEEE802.15.4无线标准研制开发的有组网,安全和应用软件方面的通信技术。zigbee应用范围:   智能家居-对家用电器的控制和家庭娱乐系统的管理。   楼宇自动化-整合并集中管理照…

    2022年4月8日
    93
  • objective c源码_以下C代码有哪些错误

    objective c源码_以下C代码有哪些错误我是前言看开源代码时,总会看到一些大神级别的代码,给人眼前一亮的感觉,多数都是被淡忘的C语言语法,总结下objc写码中遇到的各类非主流代码技巧和一些妙用:[娱乐向]objc最短的方法声明[C]结构体的初始化[C]三元条件表达式的两元使用[C]数组的下标初始化[objc]可变参数类型的block[objc]readonly属性支持扩展的写法[C]小括号内联复合表达式[娱乐向]奇葩的C

    2022年10月18日
    3
  • BP神经网络预测模型(神经网络算法模型)

    学习率一般在(0,0.1)区间上取值.隐含层节点数量(√为开根号):①m=(√(i+j))+α②m=log2(i)③m=√(i*j)m:隐含层节点i:输入层节点数j:输出层节点数α:1-10之间的常数

    2022年4月11日
    59
  • 最新tracker服务器网站_服务器网速测试

    最新tracker服务器网站_服务器网速测试Tracker服务器是对于BT下载必须的,网上随便搜索一下就有很多Tracker服务器列表,一个服务器文件少则几十个,多则上百个,但”杂乱无章”,要不就是用不了,要不就是在中不可用,要不就是重复,真正能用的就比较少了。提供的服务器在中国都ping得通,每24小时自动更新,自动检测,从几个百服务器筛选出在中国可通的服务器列表。[下载中国可用Tracker服务器列表-每24小时更新]提供的服务…

    2022年10月1日
    6
  • sql优化的几种方法面试题_mysql存储过程面试题

    sql优化的几种方法面试题_mysql存储过程面试题drop、delete与truncate分别在什么场景之下使用?对比一下他们的区别:droptable1)属于DDL2)不可回滚3)不可带where4)表内容和结构删除5)删除速度快truncatetable1)属于DDL2)不可回滚3)不可带where4)表内容删除5)删除速度快deletefrom1)属于DML2)可回滚3)可带where4)表结构在,表内容要看where执行的情况5)删…

    2022年8月27日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号