数据库之 redis

前言:

就学习爬虫而言,对于三种常见的数据库做个基本了解足以,所以笔记都是浅尝辄止,不会涉及太深入的东西。

redis简介

Redis(Remote Dictionary Server ,远程字典服务) 是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库,是NoSQL数据库(非关系型)。

-------------->>>>>

redis的出现主要是为了替代早期的Memcache缓存系统的。map内存型(数据存放在内存中)的非关系型(nosql)key-value(键值存储)数据库。
支持数据的持久化(基于RDB和AOF,注: 数据持久化时将数据存放到文件中,每次启动redis之后会先将文件中数据加载到内存,经常用来做缓存、数据共享、购物车、消息队列、计数器、限流等。(最基本的就是缓存一些经常用到的数据,提高读写速度)

redis特性

● 速度快
● 持久化
● 多种数据结构
● 支持多种编程语言
● 主从复制
● 高可用、分布式

Redis的数据类型及主要特性

Redis提供的数据类型主要分为5种自有类型和一种自定义类型。

这5种自有类型包括:String类型、哈希类型、列表类型、集合类型和顺序集合类型。

示例如下:

#很像python的一个大字典:
redis={
"name":"hailey",                      #String类型
"age":"23",                           #String--数字类型
"scors":[78,79,98,],                  #list类型
"info":{"gender":"male","tel":"110"}, #哈希类型,键值结构嵌套键值
"set":{1,2,3},                        #集合类型              
"zset":{1,2,3,}                       #有序集合
}

 Redis的应用场景

● 缓存系统(“热点”数据:高频读、低频写):缓存用户信息,优惠券过期时间,验证码过期时间、session、token等。
● 计数器:帖子的浏览数,视频播放次数,评论次数、点赞次数等
● 消息队列,秒杀系统
● 社交网络:粉丝、共同好友(可能认识的人),兴趣爱好(推荐商品)
● 排行榜(有序集合)
● 发布订阅:粉丝关注、消息通知

-------------------------------------

在实际中,Redis常和mysql一起使用,通常先把数据存储在Redis,再同步给mysql,查询的时候也是先从Redis中进行查询;例如有时候在网站修改名字不刷新的时候没更新成功,就是因为还在缓存。主要图Redis存储特别快。

redis环境安装

官方原版: https://redis.io/

虽然 Redis 官方网站没有提供 Windows 版的安装包,但可以通过 GitHub 来下载 Windows 版 Redis 安装包

下载地址:点击前往

=====================================================================

安装时一路next

到“ Destination Folder”界面选择安装目录、勾选add path全局变量

“ort Number and Firewall Exception”端口号默认:6379

“Memory Limit”勾选“Set the Max Memory lmit”可修改Max Memory MB,即redis占用内存的限制。

下面详细记录windows的完整安装步骤:

 ❶ 进入GitHub开始下载:

解压zip安装包,解压后的文件目录:

❷ 创建Redis临时服务:

双击启动服务端程序redis.server.exe,界面如下

上图中显示一些 Redis 的相关信息,比如 Redis 的版本号以及默认端口号(6379)。

注意,为了实现后续操作,需要保持服务端开启状态,否则客户端无法正常工作。 

双击启动客户端程序redis.cli.exe,界面如下:说明 Redis 本地客户端与服务端连接成功。

❸ 命令创建Redis服务:

上述方式虽然简单快捷,但是显然不是程序员的操作,下面介绍,通过命令启动 Redis 服务端,并将 Redis 服务添加到 Windows 资源管理器,实现开机后自动启动。

注册Redis服务

通过 CMD 命令行工具进入 Redis 安装目录,将 Redis 服务注册到 Windows 服务中,执行以下命令:

redis-server.exe --service-install redis.windows.conf --loglevel verbose

执行后输出8060这两行,说明注册成功:

启动Redis服务

执行以下命令启动 Redis 服务,命令如下:

redis-server --service-start

执行启动后,如下所示:

注意:

此时 Redis 已经被添加到 Windows 服务中(cmd中输入services.msc),因此不会再显示 Redis 服务端的相应的信息:

启动Redis客户端

在 CMD 命令行输出 redis-cli 命令启动客户端

redis-cli

如下:

检查是否连接成功

测试客户端和服务端是否成功连接。输出PING命令,若返回PONG则证明成功连接:

❹ 配置环境变量:

此电脑 -> 右击“属性” -> 高级系统设置 -> 环境变量 ->系统变量(s) -> 双击path -> 新建,填写路径

安装命令总结

安装服务:redis-server --service-install
卸载服务:redis-server --service-uninstall
开启服务:redis-server --service-start
停止服务:redis-server --service-stop
服务端启动时重命名:redis-server --service-start --service-name Redis1

Python操作redis

连接redis

在python中有一个专门的redis第三库

还是需要先进行安装:pip install redis

引用:import redis

链接方式1:

import redis(在python中improt之前,本地还是需要先进行安装redis)

r = redis.Redis(host='本地ip', port=6379)  #本机链接也可省略host和port
r.set('foo', 'Bar')    #写入数据
print(r.get('foo'))    #获取数据

链接方式2:

import redispool = redis.ConnectionPool(host='服务器ip', port=6379)  #远程链接必须写
r = redis.Redis(connection_pool=pool)
r.set('bar', 'Foo')        #写入数据
print(r.get('bar'))        #获取数据

通常情况下, 当我们需要做redis操作时, 会创建一个连接, 并基于这个连接进行redis操作, 操作完成后, 释放连接,一般情况下, 这是没问题的, 但当并发量比较高的时候, 频繁的连接创建和释放对性能会有较高的影响。

于是, 连接池就发挥作用了。连接池的原理是, 通过预先创建多个连接, 当进行redis操作时, 直接获取已经创建的连接进行操作, 而且操作完成后, 不会释放, 用于后续的其他redis操作。

这样就达到了避免频繁的redis连接创建和释放的目的, 从而提高性能。

数据类型操作

(1) 字符串操作

import redispool = redis.ConnectionPool(host='ip', port=6379, db=0, decode_responses=True)
r = redis.Redis(connection_pool=pool)#字符串操作:不允许对已经存在的键设置值
ret = r.setnx("name", "eric")
print(ret)  # False#设置键有效期
r.setex("good_1001", 10, "2")#字符串操作:自增自减
r.set("age", 20)
r.incrby("age", 2)
print(r.get("age"))  # b'22'

(2) hash操作

import redispool = redis.ConnectionPool(host='ip', port=6379, db=0, decode_responses=True)
r = redis.Redis(connection_pool=pool)r.hset("info", "name", "rain")
print(r.hget("info", "name"))  # b'rain'
r.hmset("info", {"gedner": "male", "age": 22})
print(r.hgetall("info"))  # {b'name': b'rain', b'gender': b'male', b'age': b'22'}

(3) list操作

import redispool = redis.ConnectionPool(host='ip', port=6379, db=0, decode_responses=True)
r = redis.Redis(connection_pool=pool)r.rpush("scores", "100", "90", "80")
r.rpush("scores", "70")
r.lpush("scores", "120")
print(r.lrange("scores", 0, -1))  # ['120', '100', '90', '80', '70']
r.linsert("scores", "AFTER", "100", 95)
print(r.lrange("scores", 0, -1))  # ['120', '100', '95', '90', '80', '70']
print(r.lpop("scores"))  # 120
print(r.rpop("scores"))  # 70
print(r.lindex("scores", 1)) # '95'

(4) 集合操作

import redispool = redis.ConnectionPool(host='ip', port=6379, db=0, decode_responses=True)
r = redis.Redis(connection_pool=pool)# key对应的集合中添加元素
r.sadd("name_set", "zhangsan", "lisi", "wangwu")
# 获取key对应的集合的所有成员
print(r.smembers("name_set"))  # {'lisi', 'zhangsan', 'wangwu'}
# 从key对应的集合中随机获取 numbers 个元素
print(r.srandmember("name_set", 2))
r.srem("name_set", "lisi")
print(r.smembers("name_set"))  # {'wangwu', 'zhangsan'}

(5) 有序集合操作

import redispool = redis.ConnectionPool(host='ip', port=6379, db=0, decode_responses=True)
r = redis.Redis(connection_pool=pool)# 在key对应的有序集合中添加元素
r.zadd("jifenbang", {"yuan": 78, "rain": 20, "alvin": 89, "eric": 45})
# 按照索引范围获取key对应的有序集合的元素
# zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)
print(r.zrange("jifenbang", 0, -1))  # ['rain', 'eric', 'yuan', 'alvin']
print(r.zrange("jifenbang", 0, -1, withscores=True))  # ['rain', 'eric', 'yuan', 'alvin']
print(r.zrevrange("jifenbang", 0, -1, withscores=True))  # ['rain', 'eric', 'yuan', 'alvin']print(r.zrangebyscore("jifenbang", 0, 100))
print(r.zrangebyscore("jifenbang", 0, 100, start=0, num=1))# 删除key对应的有序集合中值是values的成员
print(r.zrem("jifenbang", "yuan"))  # 删除成功返回1
print(r.zrange("jifenbang", 0, -1))  # ['rain', 'eric', 'alvin']

(6) 键操作

import redispool = redis.ConnectionPool(host='ip', port=6379, db=0, decode_responses=True)
r = redis.Redis(connection_pool=pool)r.delete("scores")
print(r.exists("scores"))
print(r.keys("*"))
r.expire("name",10)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/195537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单可行的SeruatV4的安装方案

目前Seurat的版本从V4升级到了V5,由于一些变化,导致当年取巧,使用获取数据的方法都无法在V5中使用。 建议在操作前重启下Rstudio(或更确切的说是R)!!! 那么如何确保自己能够安装V4的…

活动回顾|德州仪器嵌入式技术创新发展研讨会(上海站)成功举办,信驰达科技携手TI推动技术创新

2023年11月28日,德州仪器(TI)嵌入式技术创新发展研讨会在上海顺利举办。作为TI中国第三方IDH,深圳市信驰达科技有限公司受邀参加,并设置展位,展出CC2340系列低功耗蓝牙模块及TPMS、蓝牙数字钥匙解决方案,与众多业内伙伴…

Vue框架学习笔记——列表渲染:v-for

文章目录 前文提要代码正文 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 主要学习链接&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 代码正文 <body><div id"box"><ul><li v-for"(p,index)…

Synchronized关键字的底层原理

Synchronized实现 Synchronized创建的时候一个互斥的对象锁&#xff0c;每次只有一个线程可以获取该锁。 其底层主要是基于Monitor实现的&#xff0c;在对象的对象头中存储了MarkWord存储的就是Monitor的地址。 对象的内存结构 对象在内存中存储主要分为三个部分&#xff1a…

聊一聊大模型 | 京东云技术团队

事情还得从ChatGPT说起。 2022年12月OpenAI发布了自然语言生成模型ChatGPT&#xff0c;一个可以基于用户输入文本自动生成回答的人工智能体。它有着赶超人类的自然对话程度以及逆天的学识。一时间引爆了整个人工智能界&#xff0c;各大巨头也纷纷跟进发布了自家的大模型&#…

电动车刷卡-CI522方案

Ci522是一颗工作在13.56MHz频率下的非接触式读写芯片&#xff0c;支持读A卡&#xff08;CI523支持读A/B卡&#xff09;&#xff0c;可做智能门锁、电动车NFC一键启动、玩具NFC开锁等应用。为部分要求低成本&#xff0c;PCB小体积的产品提供了可靠的选择。 Ci522与Si522/MFRC52…

IDEA插件MybatisLog Free失效,不打印日志解决

因为此插件是基于mybatis的本地日志打印基础上操作的,所以检查是否配置日志输出版本. 如果使用的是mybatis-plus框架检查是否有下面语句 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 如果使用的是mybatis框架检查是否有下面语…

巧用JAVA自带的API解决日期类问题

文章目录 题目代码优势 题目 特殊日期 代码 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改 import java.time.LocalDate; public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);//在此输入您的代…

Python更改YOLOv5、v7、v8,实现调用val.py或者test.py后生成pr.csv,然后再整合绘制到一张图上(使用matplotlib绘制)

1. 前提 效果图 不错的链接&#xff1a;YOLOV7训练模型分析 关于map的绘图、loss绘图&#xff0c;可参考&#xff1a;根据YOLOv5、v8、v7训练后生成的result文件用matplotlib进行绘图 v5、v8调用val.py&#xff0c;v7调用test.py&#xff08;作用都是一样的&#xff0c;都是…

基于Linux的网络防火墙设计方法

摘要 随着Internet的迅速发展&#xff0c;网络越来越成为了人们日常生活不可或缺的一部分&#xff0c;而随之引出的网络安全问题也越来越突出&#xff0c;成为人们不得不关注的问题。 为了在一个不安全的网际环境中构造出一个相对安全的环境&#xff0c;保证子网环境下的计算机…

行业分析:2023年木炭行业市场需求及发展前景

木炭是一种燃料名称。是木材或木质原料经过不完全燃烧&#xff0c;或者在隔绝空气的条件下热解&#xff0c;所残留的深褐色或黑色多孔固体燃料。木炭产品主要分为白炭、黑炭、活性炭、机制炭等四大类。 木炭是保持木材原来构造和孔内残留焦油的不纯的无定形碳。中国商代的青铜器…

【每日OJ —— 101. 对称二叉树】

每日OJ —— 101. 对称二叉树 1.题目&#xff1a;101. 对称二叉树2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;101. 对称二叉树 2.解法 2.1.算法讲解 1.该题是判断二叉树是否对称&#xff0c;关键在于&#xff0c;左子树等于右子树&#xff0c;而所给的…

Java手写字典树(Trie树),实现敏感词过滤

1.简介 字典树&#xff1a;也叫做前缀树&#xff0c;是一种高效的存储、配对字符串的数据结构&#xff0c;存储过程如下&#xff1a; 假设我们有单词&#xff1a;app、apple、cat。如果存在链表中&#xff1a; ["app"、"apple"、"api"、"…

Linux 文件查找

1 文件查找 在文件系统上查找符合条件的文件 文件查找&#xff1a;locate&#xff0c;find 1.1 locate 工作特点&#xff1a; 格式&#xff1a; Usage: locate [OPTION]... [PATTERN]...常用选项&#xff1a; -i &#xff1a;不区分大小写的搜索 -n N &#xff1a;只列举前…

python程序将部分文件复制到指定目录

geotools-28.2中的lib一共有264个jar包&#xff0c;但我只想将部分100个左右jar包引导我的环境中&#xff0c;那个就需要从目录中找出想要的那100个jar&#xff0c;手动挑选太费时间&#xff0c;我简单的写了个小脚本来实现。 我将想要的jar文件名和路径存放到txt中&#xff0…

Python编程的经典示例及应用

前言 Python作为一种简洁而强大的编程语言&#xff0c;提供了许多经典示例以展示其语言特性和功能。在本文中&#xff0c;我们将探讨一些经典的Python示例&#xff0c;并展示它们在实际应用中的价值。通过这些示例&#xff0c;读者可以深入了解Python的灵活性和易用性&#xff…

js选中起始时间使用标准时间毫秒值计算一年后的当前少一天的日期(并考虑闰年)

js选中起始时间使用标准时间毫秒值计算一年后的当前少一天的日期 实际代码里面带入默认日期’20230301’这个特殊日期&#xff0c;因为下一年的当前日期少一天为闰年的2月会有29天&#xff0c;使用特殊值校验代码效果图 HTML部分代码 <el-button click"chengTime()&q…

C# WPF上位机开发(带配置文件的倒计时软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们写了倒计时软件&#xff0c;但是不知道大家有没有发现&#xff0c;这个软件起始有一个缺点&#xff0c;那就是倒计时的起始时间都是硬编码…

Spring Security 自定义异常失效?源码分析与解决方案

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

分享73个节日PPT,总有一款适合您

分享73个节日PPT&#xff0c;总有一款适合您 73个节日PPT下载 链接&#xff1a;https://pan.baidu.com/s/1FG9Y-9yR31Y-fs3zxKI4Pg?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…