数据库之 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.hqwc.cn/news/245135.html

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

相关文章

他山之石,可以攻玉|银行业数据中心数字化转型之模型篇 04(完结)

导语:他山之石,可以攻玉|银行业数据中心数字化转型之模型篇 04(完结) 银行业数据中心数字化转型是一项系统性工程既涉及管理层面转型——包括数字化转型战略、基础架构和技术架构转型、技术创新和知识体系转型&#xf…

uniapp自定义进度条组件

目标效果 原型设计为这样的样式&#xff0c;但是现有的进度条都无法满足需求&#xff0c;于是编写组件实现。 设计引用格式为 <zLineProgress :total"15" :val"7" title"你好吗" />定义组件 <template><view style"hei…

SpringBoot的配置加载优先级

目录 一、背景分析 二、学习资源 三、具体使用 四、一些小技巧 方式一 方式二 一、背景分析 SpringBoot项目在打包之后&#xff0c;其配置文件就在jar包内&#xff0c;如果没有<配置文件优先级>这个机制&#xff0c;那么项目打成jar包之后&#xff0c;如果启动项目…

Python的模块与库,及if __name__ == ‘__main__语句【侯小啾python领航班系列(二十四)】

Python的模块与库,及if name == __main__语句【侯小啾python领航班系列(二十四)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

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

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

关于svn如何上传一个完整的项目

注意&#xff1a;请一定要按照该步骤进行操作&#xff0c;请上传新项目时将项目名称进行规范命名 例如原始文件是arrange_v2 将此项目需要注入新的医院 则命名为 arrange_某医院名称_门诊或者医技或者药房_v2 重新命名文件夹名称快捷键 &#xff08;F12&#xff09; 一 &…

计算机网络扫盲(4)——时延

一、概述 在这里&#xff0c;我们考虑分组交换网的情况&#xff0c;因特网可以被看成是一种基础设施&#xff0c;该基础设施为运行在端系统上的分布式应用提供服务。在理想情况下&#xff0c;我们希望因特网服务能够在任意两个端系统之间随心所欲地移动数据而没有任何数据地丢失…

Python标准库:copy模块【侯小啾python领航班系列(十五)】

Python标准库:copy模块【侯小啾python领航班系列(十五)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

风控交易系统跟单系统资管软件都有哪些功能特点?

资管分仓软件的主要功能就是母账户可以添加子账号&#xff0c;并且设置出入金&#xff0c;手续费、保证金、风控等功能&#xff0c;同时监控端更可以直观的看子账户的交易情况直接折线图展示更加直观&#xff0c;在监控端的最高权限可以直接一键平仓子账户&#xff08;如果子账…

二蛋赠书十期:《剪映短视频剪辑从入门到精通》

前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此&#xff0c;我非常感激大家一直…

大数据|计算机毕业设计——基于Django协同过滤算法的房源可视化分析推荐系统的设计与实现

大数据|计算机毕业设计——基于Django协同过滤算法的房源可视化分析推荐系统的设计与实现 技术栈&#xff1a;大数据爬虫/机器学习学习算法/数据分析与挖掘/大数据可视化/Django框架/Mysql数据库 本项目基于 Django框架开发的房屋可视化分析推荐系统。这个系统结合了大数据爬…

“此应用专为旧版android打造,因此可能无法运行”,问题解决方案

当用户在Android P系统上打开某些应用程序时&#xff0c;可能会弹出一个对话框&#xff0c;提示内容为&#xff1a;“此应用专为旧版Android打造&#xff0c;可能无法正常运行。请尝试检查更新或与开发者联系”。 随着Android平台的发展&#xff0c;每个新版本通常都会引入新的…