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


相关推荐

  • 机器学习之朴素贝叶斯算法详解

    机器学习之朴素贝叶斯算法详解1-1基本流程朴素贝叶斯公式:P(A|B)=P(A)P(B|A)P(B)P(A|B)=P(A)P(B|A)P(B)P(A|B)=\frac{P(A)P(B|A)}{P(B)}一、概率基础知识:条件概率是指事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为:P(A|B),读作“在B条件下A的概率”。若只有两个事件A,B,那么:P(AB)=P…

    2025年8月14日
    4
  • Dll注入的问题

    Dll注入的问题学习游戏辅助,根据郁金香的教学视频写了Dll注入的代码,针对热血江湖进行Dll注入,失败(通过360任务管理器查看到Dll并未注入到游戏进程中)。但Dll中的SetWindowsHookEx返回值不为空,说明Hook成功?但是为啥没有注入成功呢?已经在游戏进程敲击键盘了【通过键盘钩子来实现Hook的】分析原因,先是反复检查代码,并未发现问题。后面想起来,是否因为是Dll是32位,而游戏是64位?查…

    2022年5月17日
    68
  • 眼球追踪[通俗易懂]

    眼球追踪[通俗易懂]眼球追踪类似于头部追踪,但是图像的呈现取决于使用者眼睛所看的方向。例如,人们可以用“眼神”完成一种镭射枪的瞄准。眼球追踪技术很受VR专家们密切关注。Oculus创始人帕尔默•拉奇就曾称其为“VR的心

    2022年8月5日
    7
  • Jmeter性能测试(一)性能测试关键指标解析

    Jmeter性能测试(一)性能测试关键指标解析一、性能测试关键指标解析1、响应时间多–并发量快–延时、响应时间好–稳定性(长时间运行)省–资源利用率响应时间:对请求作出响应所需要的的时间,是用户感知软件性能的主要指标。响应时间包括:1.用户客户端呈现时间2.请求/响应数据网络传输时间3.应用服务器处理时间4.数据库系统处理时间响应时间多少合理?对于一个Web系统,普遍接受的响应时间标准为2/5/8秒(2秒–非常好;5秒–可接受;8秒是上限)2、并发用户数用户…

    2022年6月17日
    132
  • Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系

    Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系

    2021年4月10日
    150
  • 软件测试常考面试题-软件测试面试宝典(一篇足矣)

    https://blog.csdn.net/mj813/article/details/52451355,对原文进行整理问:软件测试的原则?答:https://blog.csdn.net/weixin_30363263/article/details/102986878问:你在测试中发现了一个bug,但是开发经理认为这不是一个bug,你应该怎样解决。1、将问题提交到缺陷…

    2022年4月7日
    42

发表回复

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

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