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)
上一篇 2022年6月19日 下午11:00
下一篇 2022年6月19日 下午11:16


相关推荐

  • Matlab 如何生成三维图像

    Matlab 如何生成三维图像介绍两种方法 用 surf 和 CurveFitting 两者的区别在于 surf 方法出的图是固定的 视角不可改变 CurveFitting 方法的三维图可以转动视角 一 surf 例如有代码 生成数据 xn1 linspace 0 4 定义 x1 的点列默认是 100 个 04 代表上下界 xn2 linspace 0 4 定义 x2 的点列 X1 X2 meshgrid xn1 xn2 X Y 轴数据

    2026年3月18日
    3
  • 关于==和equals的区别和联系,面试这么回答就可以

    关于==和equals的区别和联系,面试这么回答就可以长篇大论的话 我这里就不多写了 相信大家入门 java 的时候就知道个大概了 这里想表述的是 如果面试官问你 关于 和 equals 的区别 该怎么回答完美呢 可以这样说总结的来说 1 对于 比较的是值是否相等如果作用于基本数据类型的变量 则直接比较其存储的 值 是否相等 如果作用于引用类型的变量 则比较的是所指向的对象的地址 2 对于 equals 方法 注

    2026年3月26日
    3
  • tomcat打印日志乱码,入库数据正常_tomcat输出日志乱码

    tomcat打印日志乱码,入库数据正常_tomcat输出日志乱码Tomcat后台日志乱码问题文章目录Tomcat后台日志乱码问题一、找到乱码原因二、Tomcat端乱码处理三、IDEA端设置小结一、找到乱码原因  基本上我们安装的windows系统本地语言都是中文,用的是GBK编码,而我们IDEA和Tomcat日志选择的是utf8编码,因此编码方式不一致造成了我们的中文乱码问题。二、Tomcat端乱码处理  既然原因已经找到了,接着就是解决问题了,分别设置IDEA和Tomcat的编码就ok了。先对Tomcat进行处理,如下:  1.找到Tomcat的安装目录

    2026年4月13日
    3
  • consolewriteline用法_reviewmodule

    consolewriteline用法_reviewmodule严格模式ES6的模块自动采用严格模式,不管你有没有在模块头部加上"usestrict";。严格模式的限制如下变量必须声明后再使用函数的参数不能有同名属性,否则报错不能

    2022年7月31日
    9
  • vue slot插槽_vue插槽的使用场景

    vue slot插槽_vue插槽的使用场景为什么使用slotslot(插槽)在生活中很多地方都有插槽,电脑usb的插槽,插板当中的电源插槽插槽的目的是为了让我们原来的设备具备更多的扩展性比如电脑的USB我们可以插入U盘,手机,鼠标,键

    2022年8月7日
    8
  • 查看端口是否占用 linux_打开vnc端口

    查看端口是否占用 linux_打开vnc端口准备使用python写一个端口探测的Linux如何查看端口1、lsof-i:端口号用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof-i:8000#lsof-i:8000COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAMElwfs22065root6uIPv443950530…

    2022年7月27日
    20

发表回复

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

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