当前位置: 首页 > news >正文

Redis 键值对数据库学习

目录

一、介绍

二、安装以及连接

三、设置连接密码

四、连接报错

五、redis 操作字符串以及过期时间

六、 redis 列表操作

七、redis 集合操作

八、hash 哈希操作

九、redis 发布和订阅操作

十、RDB和AOF的两种数据持久化机制

十一、 其他机器连接redis

十二、 python 操作redis

1. 安装python-redis  以及连接redis

2. 操作数据

3.  事务操作

4. 发布与订阅


一、介绍

redis 是一种 nosql 数据库,他的数据是保存在内存中,同时 redis 可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比 memcached 支持更多的数据结构( string,list表[队列和栈],set[集合],sorted set[有序集合],hash(hash表)。

redis 使用场景:

  1. 登录会话存储,存储在 redis 中,与 memcached 相比,数据不会丢失。
  2. 排行版/计数器:比如一些秀场类的项目,经常会有一些前多少名的主播排名。还有一些文章阅读量的技术,或者新浪微博的点赞数等。
  3. 作为消息队列:比如 celery 就是使用 redis 作为中间人。
  4. 当前在线人数:还是之前的秀场例子,会显示当前系统有多少在线人数。
  5. 一些常用的数据缓存:比如我们的 BBS 论坛,板块不会经常变化的,但是每次访问首页都要从"ys591 中获取,可以在 redis 中缓存起来,不用每次请求数据库。
  6. 把前200篇文童缓存或者评论缓存:一般用户浏览网站,只会浏览前面一部分文章或者评论,那么可以把前面200篇文童和对应的评论缓存起来。用户访问超过的,就访问数据库,并且以后文章超过200篇,则把之前的文章删除。
  7. 好友关系: 微博的好友关系使用 redis 实现。
  8. 发布和订阅功能:可以用来做聊天软件。        

二、安装以及连接

参考文章链接:【Redis】在Mac上安装使用redis的教程_mac安装redis-CSDN博客

  1. 安装:brew install redis
  2. 开启服务:brew services start redis
  3. 关闭服务: brew services stop redis
  4. 指定端口号:redis-cli -h 127.0.0.1 -p 6379

-h ip地址; -p 端口号 ; -a 密码 

三、设置连接密码

  1. 配置文件设置连接密码:

第一步:cd /opt/homebrew/etc 

第二步:open redis.conf

报错了!!No application knows how to open URL file:///opt/homebrew/etc/redis.conf

解决: 换成  open -e redis.conf  命令

第三步:在redis.conf 中修改requirepass 密码,如图所示:

 第四步:运行 redis-server /opt/homebrew/etc/redis.conf 

第五步:运行 redis-cli -h 127.0.0.1 -p 6379 -a 123456

四、连接报错

报错:Could not connect to Redis at 127.0.0.1:6379: Connection refused

方式一: 查看服务是否启动

方式二: 如果服务已经启动还是报错,通过以下方式解决:

  1. 检查redis 服务的状态:redis-cli ping,确认redis 服务正在运行,如果返回PONG,则表示Redis服务器正在运行。
  2. 如果没有返回或者返回其他错误消息,我们需要通过以下命令启动Redis服务器: redis-server
  3. 参考链接: 解决Could not connect to Redis at 127.0.0.1:6379: Connection refused的具体操作步骤_mob649e816a3664的技术博客_51CTO博客

五、redis 操作字符串以及过期时间

  1. 添加字符串         set key value

  2. 查看字符串.        get key

  3.  设置过期时间 

  • set key value EX 过期时间()   比如:set username axuan EX 10

  • expire key 过期时间()           比如:expire age 204. 查看过期时间  ttl key 

  1. 查看所有字符串     keys *

  2. 删除字符串          del key

其他命令: 

  • 删除所有的key  flushall
  • 六、 redis 列表操作

  • 在列表左边添加元素

         lpush key value             比如:lpush userlist xuan

  • 在列表右边添加元素

         rpush key value       

  • 查看列表中的元素

         lrange key start stop      比如:lrange userlist 0 -1 返回所有的元素

  • 移除并返回列表key的头元素

        lpop key

  • 移除并返回列表key的尾元素

        rpop key

  • 移除并返回返回列表key的中间元素,count个值为value的元素

        lrem key count value        比如:lrem userlist 1 haha

  • 指定返回第几个元素(元素序号是从0开始)

          lindex key index

  • 获取列表中的元素个数

          llen key

  • 删除指定的元素

        lrem key count value

         count > 0:从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。

         count < 0:从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。

        count = 0: 移除表中所有与 value 相等的值。

七、redis 集合操作

  • 添加元素

        sadd set value1 value2 比如:sadd school1 qinghua beida

  • 查看元素

        smembers  set 比如:smembers school1

  • 移除元素

        srem set memeber  比如:srem school1 beida

  • 查看集合中的元素个数

        scard set 比如:scard school1

  • 获取多个集合的交集

        sinter set1 set2 比如sinter school1 school2

  • 获取多个集合的并集

        sunion set1 set2 比如:sunion school1 school2

  • 获取多个集合的差集

        sdiff set1 set2 比如:sdiff school1 school2

八、hash 哈希操作

  • 添加一个新值

        hset key field value 比如:hset person name xuan

  • 添加多个新值

        hmset key field value field value... 比如:hmset person address jueeweee height 155

  • 获取哈希中的field对应的值

        hset key field 比如:hget person name

  • 删除field 中的某个field

        hdel key field 比如:hdel person height

  • 获取某个哈希中所有的field 和 value

        hgetall key 比如:hgetall person

  • 获取某个哈希中所有的field

        hkeys key 比如:hkeys person

  • 获取某个哈希中所有的值

        hvals key 比如:hvals person

  • 判断哈希是否存在某个filed

          hexists key field 比如:hexists person age

  • 获取哈希中总共的键值对

        hlen key 比如:hlen person key

  1. redis 事务操作
  1. 事务特点

        Redis 事务可以一次执行多个命令,事务具有以下特征:

  • 隔离操作:事务中的所有命令都会序列化、按顺序地执行,不会被其他命令打扰。
  • 原子操作: 事务中的命令要么全部被执行,要么全部都不执行。

     2. 操作事务

  • 开启一个事务

        multi

  • 执行事务,会将在multi 和exec 中的操作一并提交

        exec

如下图所示:

127.0.0.1:6379> multi

OK

127.0.0.1:6379(TX)> set username axuanya

QUEUED

127.0.0.1:6379(TX)> get username

QUEUED

127.0.0.1:6379(TX)> exec

1) OK

2) "axuanya"

  • 取消事务

        discard

  • 监视一个或者多个key,如果在事务执行之前这个(或这些)key 被其他命令所改动,那么事务将被打断

 127.0.0.1:6379> watch username

OK

127.0.0.1:6379> multi

OK

127.0.0.1:6379(TX)> set username hahahaha

QUEUED

127.0.0.1:6379(TX)> exec

1) OK

127.0.0.1:6379> get username

"hahahaha"

127.0.0.1:6379>

  • 取消所有key的监视

        unwatch

九、redis 发布和订阅操作

  1. 给某个频道发布消息

        publish channel message

      2. 订阅某个频道发布消息

        subscribe channel

十、RDB和AOF的两种数据持久化机制

RDB

AOF

开启关闭

开启: 默认开启。关闭: 把配置文件中所有的save都注释,就是关闭了。

开启:在配置文件中appendonly ,yes 即开启了 aof ,为 no 关闭。

同步机制

可以指定某个时间内发生多少个命令进行同步。比如1分钟内发生了2次命令,就做一次同步。

*save 900 1:如果在900s以内发生了1次数据更新操作,那么就会做一次同步操作。

*save 300 10: 如果在300s以内发生了10数据更新操作,那么就会做一次同步操作。

*save 60 10000:如果在60s以内发生了10000数据更新操作,那么就会做一次同步操作。

每秒同步或者每次发生命令后同步。

*appendfsync always:每次有数据更新操作,都会同步到文件中。

* appendfsync everysec:每秒进行一次更新。

* appendfsync no:使用操作系统的方式进行更新。普遍是30s更新一次。

存储内容

存储的是redis里面的具体的值

存储的是执行的更新数据的操作命令

存储路径

根据redis.conf下的dir以及rdbfilename来指定的。默认是/var/lib/redis/dump.rdb

根据redis.conf下的dir以及appendfilename来指定的。默认是/var/lib/redis/dump.rdb

优点

  1.  存储数据到文件中会进行压缩,文件体积比aof小。(2) 因为存储的是redis具体的值,并且会经过压缩,因此在恢复的时候速度比AOF快。

(3)非常适用于备份。

(1) AOF的策略是每秒钟或者每次发生写操作的时候都会同步,因此即使服务器故障,最多只会丢失1秒的数据。(2) AOF存储的是Redis命令,并且是直接追加到aof文件后面,因此每次备份的时候只要添加新的数据进去就可以了。(3) 如果AOF文件比较大了,那么Redis会进行重写,只保留最小的命令集合。

缺点

  1. RDB在多少时间内发生了多少写操作的时候就会出发同步机制,因为采用压缩机制,RDB在同步的时候都重新保存整个Redis中的数据,因此你一般会设置在最少5分钟才保存一次数据。在这种情况下,一旦服务器故障,会造成5分钟的数据丢失。(2)在数据保存进RDB的时候,Redis会fork出一个子进程用来同步,在数据量比较大的时候,可能会非常耗时。
  1. AOF文件因为没有压缩,因此体积比RDB大。 (2) AOF是在每秒或者每次写操作都进行备份,因此如果并发量比较大,效率可能有点慢。(3)AOF文件因为存储的是命令,因此在灾难恢复的时候Redis会重新运行AOF中的命令,速度不及RDB。

十一、 其他机器连接redis

如果想要让其他机器连接本机的redis 服务器, 那么应该在redis.conf配置文件中,指定“bind 本机的ip地址”,

这样别的机器就能连接成功。不像是网上说的,要指定对方的ip地址.

十二、 python 操作redis

1. 安装python-redis  以及连接redis

import redis
from flask import Flask
cache = redis.StrictRedis(host='127.0.0.1', port=6379, db=0)
app = Flask(__name__)
if __name__ == '__main__':app.run(debug=True)

2. 操作数据

# 1. 操作字符串
cache.set('username', 'axuan')
print(cache.get('username'))
# 2. 操作列表
cache.lpush('languages', 'java')
cache.lpush('languages', 'python')
print(cache.lrange('languages', 0, -1))
# 3. 集合的操作
cache.sadd('team', 'yuyu')
cache.sadd('team', 'xuan')
print(cache.smembers('team'))
# 4. 哈希的操作
cache.hset('person','name','xuanya')
cache.hset('person','age','25')
print(cache.hgetall('person'))

3.  事务操作

pip=cache.pipeline()
pip.set('username','lalala')
pip.set('password','1u3u33')
# 执行事务
pip.execute()

4. 发布与订阅

# 订阅
ps = cache.pubsub()
ps.subscribe('email')
while True:for item in ps.listen():if item['type'] == 'message':print(item['data'])
# 发布
import redis
from faker import Faker
cache = redis.StrictRedis(host='127.0.0.1', port=6379, db=0)
fake = Faker(language='zh-CN')
for x in range(3):cache.publish('email', fake.email())

相关文章:

Redis 键值对数据库学习

目录 一、介绍 二、安装以及连接 三、设置连接密码 四、连接报错 五、redis 操作字符串以及过期时间 六、 redis 列表操作 七、redis 集合操作 八、hash 哈希操作 九、redis 发布和订阅操作 十、RDB和AOF的两种数据持久化机制 十一、 其他机器连接redis 十二、 pyt…...

逆向推理+ChatGPT,让论文更具说服力

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 使用ChatGPT辅助“逆向推理”技巧&#xff0c;可以显著提升论文的质量和说服力。逆向推理从结论出发&#xff0c;倒推所需的证据和论点&#xff0c;确保整个论证过程逻辑严密且无漏洞。…...

「JavaScript深入」一文说明白JS的执行上下文与作用域

JavaScript深入 — 执行上下文与作用域 上下文执行上下文生命周期创建阶段执行阶段回收阶段 执行栈作用域链作用域词法作用域&#xff08;静态作用域&#xff09; 上下文 变量或函数的上下文决定了它们可以访问哪些数据&#xff0c;以及它们的行为。 每个上下文都有一个关联的…...

Qt C++设计模式->组合模式

组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;允许你将对象组合成树形结构以表示部分与整体的层次关系。组合模式使得客户端可以以统一的方式对待单个对象和组合对象&#xff0c;简化了对复杂树形结构的操作。 组合模式的应用场景 组合…...

Acwing Bellman-Ford SPFA

1. Bellman-Ford 该算法适用于有负权边的情况&#xff0c;注意&#xff1a;如果有负权环的话&#xff0c;最短路就不一定存在了。时间复杂度 O ( m n ) . O(mn). O(mn).该算法可以求出来图中是否存在负权回路&#xff0c;但求解负权回路&#xff0c;通常用SPFA算法&#xff0c…...

我能禁止使用某协议的ip禁止访问我的资源吗

是的&#xff0c;你可以禁止使用某个协议的IP地址访问你的资源。这种操作通常涉及网络防火墙、服务器配置或应用程序设置&#xff0c;具体方法取决于你的网络环境和使用的技术。以下是一些常见的实现方法&#xff1a; 1. 使用防火墙 大多数防火墙&#xff08;硬件或软件&…...

快速理解TCP协议(二)——TCP协议中的拥塞控制机制详解

在计算机网络中&#xff0c;TCP&#xff08;传输控制协议&#xff09;是一种广泛使用的面向连接的、可靠的、基于字节流的传输层通信协议。TCP协议通过一系列复杂的机制来确保数据的可靠传输&#xff0c;其中拥塞控制是至关重要的一环。本文将深入探讨TCP协议中的拥塞控制机制&…...

Linux:debug: systemtap: ubacktrace

https://docs.huihoo.com/systemtap/sourceware.org/systemtap/SystemTap_Beginners_Guide/ustack.html 这个函数可以帮助将user level的backtrace打印出来。 stap -d /bin/ls --ldd \ -e probe process("ls").function("xmalloc") {print_usyms(ubacktra…...

使用AI进行需求分析的案例研究

生成式 AI 的潜在应用场景似乎无穷无尽。虽然这令人兴奋&#xff0c;但也可能让人不知所措。因此&#xff0c;团队在使用这项技术时需要有明确的目标&#xff1a;关键是要明确生成式 AI 在团队工作中能产生哪些实质性影响。 在软件工程中&#xff0c;一个引人注目的应用场景是…...

Python内置的re库

Python内置的re库是专门用于处理正则表达式的标准库。它提供了一系列函数和类&#xff0c;使得在Python程序中可以使用正则表达式进行字符串的搜索、替换、分割等操作。re库的使用非常广泛&#xff0c;几乎任何需要复杂文本处理的场景都可以用到它。 主要函数 1、complie函数…...

毕业设计选题:基于ssm+vue+uniapp的面向企事业单位的项目申报小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…...

jQuery 简介⑤属性操作

九、属性操作 jQuery的属性操作方法一览表 $("selector").val(); // 获取第一个匹配元素的value值(一般用于表单控("selector").val("Hello"); // 设置所有匹配元素的value值为"Hello" $("selector").html();// 获取第一个…...

[Linux] Linux操作系统 进程的状态

标题&#xff1a;[Linux] Linux操作系统 进程的状态 个人主页&#xff1a;水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 一、前置概念的理解 1.并行和并发 2.时间片 3.进程间具有独立性 4.等待的本质 正文开始&#xff1a; 在校的时候&#xff0c;你一定学过《…...

深入解析Python 中的 sortedcontainers 库:高效的排序数据结构

在日常的 Python 编程中&#xff0c;列表&#xff08;list&#xff09;、集合&#xff08;set&#xff09;和字典&#xff08;dict&#xff09;是常用的数据结构。然而&#xff0c;在某些特定的场景下&#xff0c;我们需要对数据进行排序&#xff0c;并且希望在插入、删除或访问…...

什么是服务器日志,日志有什么作用?

前言 服务器日志是指服务器等电脑设备或软件的运作记录‌。这些日志记录了服务器接收客户端处理请求的过程以及服务器对这些请求的处理结果。服务器日志对于排查和解决计算机系统和网络应用中的问题至关重要&#xff0c;因为它们包含了用于调试问题的消息、服务器状态以及其他…...

Codeforces Round 971 (Div. 4)A-G1题解

Codeforces Round 971 (Div. 4) A 就是b - a #include <bits/stdc.h> #define int long longusing namespace std;void solve() {int a, b;cin >> a >> b;cout << b - a << endl; }signed main() {ios::sync_with_stdio(false);cin.tie(0);co…...

QT----基于QML的计时器

赶上了实习的末班车,现在在做QML开发,第一天的学习成果,一个计时器.逻辑挺简单的,纯QML实现,代码在仓库,可以对比文档和提交记录学习起来更清晰 QT-Timer 学习使用c的listmodel 学习使用了如何用c的listmodel来存储数据. 新建一个TImeListModel类继承自QAbstractListModel c…...

Stable Diffusion的高分辨率修复(Hires.fix)

Stable Diffusion的高分辨率修复&#xff08;Hires.fix&#xff09;是一项重要的功能&#xff0c;它旨在提高生成图像的分辨率和细节&#xff0c;从而使画面变得更加清晰和精细。以下是关于Stable Diffusion高分辨率修复&#xff08;Hires.fix&#xff09;的详细解释&#xff1…...

智慧体育馆可视化:实时监控与智能管理

利用图扑可视化技术实现对体育馆的实时监控和数据分析&#xff0c;提升运营效率、观众体验和安全管理水平&#xff0c;打造智能化场馆环境。...

【NLP】基于“检测器-纠错器”中文文本纠错框架

前言 许多方法将中文拼写纠正&#xff08;检测和纠正给定中文句子中的错误字符&#xff09;视为序列标注任务&#xff0c;并在句子对上进行微调。一些方法使用错误检测器作为初步任务&#xff0c;然后将检测结果用于辅助后续的错误纠正过程。然而&#xff0c;现有方法在使用检…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...