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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 从网页抓取数据的一般方法

    首先要了解对方网页的运行机制 ,这可以用httpwacth或者httplook来看一下http发送和接收的数据。这两个工具应该说是比较简单易懂的。这里就不再介绍了。主要关注的内容是heade

    2021年12月27日
    42
  • 时序数据库应用_tsdb时序数据库

    时序数据库应用_tsdb时序数据库前言mysql可能大家都用的比较多且普遍,最近1年在使用PostgreSql,其大体DML语句与mysql类似,只是部分DDL语句有些区别,写一篇文章给正在应用该数据库或者准备选型该数据库的朋友,分享下使用方式与心得PostgreSqlPostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时候才…

    2022年9月27日
    4
  • mysql—如何获取有性能问题的sql

    mysql—如何获取有性能问题的sql

    2020年11月12日
    203
  • 模拟退火算法的原理+应用

    模拟退火算法的原理+应用本文转自 https www cnblogs com ranjiewen p 6084052 html 模拟退火算法 nbsp nbsp nbsp 著名的模拟退火算法 它是一种基于蒙特卡洛思想设计的近似求解最优化问题的方法 nbsp 一点历史 如果你不感兴趣 可以跳过 nbsp nbsp nbsp 美国物理学家 N Metropolis 和同仁在 1953 年发表研究复杂系统 计算其中能量分布的文章 他们使用蒙特卡罗模拟法计算多分子系统中分子的能量分

    2025年9月15日
    6
  • Java多线程——基本概念「建议收藏」

    Java多线程——基本概念「建议收藏」线程和多线程程序:是一段静态的代码,是应用软件执行的蓝本进程:是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程线程:是比进程更小的执行单位。进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念主线程:(每个Java程序都有一个…

    2022年5月13日
    39
  • JSON在PHP中的基本应用

    JSON在PHP中的基本应用从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码。一、json_encode()该函数主要用来将数组和对象,转换为json格式

    2022年7月4日
    25

发表回复

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

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