redis介绍

7171305851fa4edab260a9298a4cae48.gif一、简介

 

Redis 与其他 key - value 缓存产品有以下三个特点:

 

Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

Redis支持数据的备份,即master-slave模式的数据备份。

二、数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

 

string(字符串)

string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。

 

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

 

string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

 

hash(哈希)

Redis hash 是一个键值(key=>value)对集合。

 

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

 

list(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

 

Set(集合)

Redis 的 Set 是 string 类型的无序集合。

 

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

 

zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

 

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

 

zset的成员是唯一的,但分数(score)却可以重复。

 

三、事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

 

批量操作在发送 EXEC 命令前被放入队列缓存。

收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。

在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

 

开始事务。

命令入队。

执行事务。

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

 

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

 

 

四、redis常用命令及基本用法

1、redis连接

import redis

 

r =redis.Redis(host='127.0.0.1',port=6379)

2、也可以使用连接池连接

import redis

 

p = redis.ConnectionPool(host='127.0.0.1', port=6379)

3、基本命令string

复制代码

import redis

 

r =redis.Redis(host='127.0.0.1',port=6379)

 

#1、存储数据set(name, value, ex=None, px=None, nx=False, xx=False)

#ex,过期时间(秒)

#px,过期时间(毫秒)

#nx,如果设置为True,则只有name不存在时,当前set操作才执行

#xx,如果设置为True,则只有name存在时,当前set操作才执行

r.set('name','pt')

 

 

#2、批量设置值mset(*args, **kwargs)

r.mset(k1='v1', k2='v2')

 

#3.批量获取mget(keys, *args)

r.mget("k1","k2")

 

#4.修改值getset(name, value),将k1的值换成v2

r.getset("k1","v2"))

复制代码

4、基本命令hash

复制代码

import redis

 

r =redis.Redis(host='127.0.0.1',port=6379)

 

#1、单个增加--修改(单个取出)--没有就新增,有的话就修改

#hset(name, key, value)

#name对应的hash中设置一个键值对(不存在,则创建;否则,修改)

#参数:

#name,redis的name

#key,name对应的hash中的key

#value,name对应的hash中的value

r.hset("name_hash","k1","v1")

 

#2、hsetnx(name, key, value)只能新建

r.hsetnx("name_hash","k1","v1")

 

#3、批量增加(取出)

#hmset(name, mapping)

#在name对应的hash中批量设置键值对

#参数:

#name,redis的name

#mapping,字典,如:{'k1':'v1', 'k2': 'v2'}

r.hmset('xx', {'k1':'v1', 'k2': 'v2'})

 

#4、取出单个

#hget(name,key)

#在name对应的hash中获取根据key获取value

r.hget("name_hash","k2")

 

#5、批量取出

#hmget(name, keys, *args)

#在name对应的hash中获取多个key的值

#参数:

#name,reids对应的name

#keys,要获取key集合,如:['k1', 'k2', 'k3']

#*args,要获取的key,如:k1,k2,k3

r.hmget('xx', 'k1', 'k2')

 

#6、取出所有的键值对

#hgetall(name)

#获取name对应hash的所有键值

r.hgetall("name_hash")

 

#7、删除键值对

#hdel(name,*keys)

#将name对应的hash中指定key的键值对删除

r.hdel("name_hash","k1") 删除一个键值对

复制代码

5、基本命令list

复制代码

import redis

 

r =redis.Redis(host='127.0.0.1',port=6379)

 

#1、增加(类似于list的append,只是这里是从左边新增加)--没有就新建

#lpush(name,values)

#在name对应的list中添加元素,每个新的元素都添加到列表的最左边

r.lpush('oo', 11,22,33)

 

#2、增加(从右边增加)--没有就新建

r.lpush('oo', 11,22,33)

 

#3、新增(固定索引号位置插入元素)

linsert(name, where, refvalue, value))

#在name对应的列表的某一个值前或后插入一个新值

#参数:

#name,redis的name

#where,BEFORE或AFTER

#refvalue,标杆值,即:在它前后插入数据

#value,要插入的数据

r.linsert("foo_list1","before","22","33")

 

#4、修改

#lset(name, index, value)

#对name对应的list中的某一个索引位置重新赋值

#参数:

#name,redis的name

#index,list的索引位置

#value,要设置的值

r.lset("name_list",4,20)

 

#5、删除

#lrem(name, value, num)

#在name对应的list中删除指定的值

#参数:

#name,redis的name

#value,要删除的值

#num, num=0,删除列表中所有的指定值;

#num=2,从前到后,删除2个; num=1,从前到后,删除左边第1个

#num=-2,从后向前,删除2个

r.lrem("foo_list1","2",1)

 

#6、取值(根据索引号取值)

lindex(name, index)

在name对应的列表中根据索引获取列表元素

r.lindex("name_list",0)

复制代码

6、基本命令set

复制代码

import redis

 

r =redis.Redis(host='127.0.0.1',port=6379)

 

#1、新增

#sadd(name,values)

#name对应的集合中添加元素

r.sadd("set1",33,44,55,66)

 

#2、 获取元素个数 类似于len

scard(name)

#获取name对应的集合中元素个数

r.scard("set1")

 

#3、 获取集合中所有的成员

smembers(name)

#获取name对应的集合的所有成员

r.smembers("set1")

 

#4、删除,随机删除,返回被删除值

#spop(name)

r.spop("set1")

 

#5、指定删除

#srem(name, values)

r.srem("set1",66)

复制代码

7、基本命令有序集合

复制代码

import redis

 

r =redis.Redis(host='127.0.0.1',port=6379)

 

#1、新增

#zadd(name, *args, **kwargs)

#在name对应的有序集合中添加元素

r.zadd('zz', 'n1', 1, 'n2', 2)

 

#2、获取有序集合元素个数 类似于len

#zcard(name)

#获取name对应的有序集合元素的数量

r.zcard('zz')

 

#3、获取name对应的有序集合中分数 在 [min,max] 之间的个数

#zcount(name, min, max)

r.zcount("zz",11,22)

 

#4、删除--指定值删除

#zrem(name, values)

r.zrem('zz', ['s1', 's2'])

复制代码

8、其他常规操作

复制代码

#1 删除

delete(*names)

#根据删除redis中的任意数据类型(string、hash、list、set、有序set)

 

#2、检查名字是否存在

#exists(name)

#检测redis的name是否存在

r.exists("ste1") True 存在就是True, False 不存在就是False

 

#3、模糊匹配

#keys(pattern='*')

#根据模型获取redis的name

r.keys(pattern='ss')

 

#4、设置超时时间

#expire(name ,time)

#为某个redis的某个name设置超时时间

r.expire(name ,5)

 

#5、 重命名

#rename(src, dst)

#对redis的name重命名为

r.rename("name2","name1")

 

#6、获取类型

#type(name)

#获取name对应值的类型

r.type("set1")

 

#7、查看所有元素

#scan(cursor=0, match=None, count=None)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

从入门到精通:详解SVN版本控制系统的使用方法

从入门到精通:详解SVN版本控制系统的使用方法 一、引言1.1、版本控制的概念和重要性1.2、流行的版本控制系统SVN 二、SVN基础知识2.1、SVN的基本概念和术语解释2.2、SVN的工作原理和架构 三、创建SVN仓库3.1、创建本地仓库3.2、配置访问权限 四、使用SVN进行版本控制…

基于视频技术与AI检测算法的体育场馆远程视频智能化监控方案

一、方案背景 近年来,随着居民体育运动意识的增强,体育场馆成为居民体育锻炼的重要场所。但使用场馆内的器材时,可能发生受伤意外,甚至牵扯责任赔偿纠纷问题。同时,物品丢失、人力巡逻成本问题突出,体育场…

企业如何寻找适合的CRM系统软件

在数字化转型步伐不断加快的今天,CRM软件成为企业必不可少的一项工具。如果您并不清楚如何寻找合适的CRM系统软件?不妨通过下列几点来寻觅。 1.根据CRM系统行业和类别 例如企业重视营销功能,搜寻营销型CRM软件; 企业希望梳理好…

Open3D 进阶(11)使用GMM-Tree算法对点云配准

GMM-Tree算法 一、算法原理1、主要函数2、参考文献二、代码实现三、结果展示1、点云初始位置2、配准后的位置四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、

DevExpress WinForms图表组件 - 直观的数据信息呈现方式!(二)

在上文中(点击这里回顾>>),我们为大家介绍了DevExpress WinForms图表控件的互动图表、图标设计器及可定制功能等,本文将继续介绍DevExpress WinForms图表控件的数据分析、大数据功能等,欢迎持续关注我们哦~ Dev…

PDF文件超出上传大小?三分钟学会PDF压缩

PDF作为一种流行的文档格式,被广泛用于各种场合,然而有时候PDF文件的大小超出了上传限制,这时候我们就需要采取一些措施来减小PDF文件的大小,下面就给大家分享几个方法,一起来学习下吧~ 方法一:嗨格式压缩大…

基于数据驱动的成本洞察,趣丸科技的FinOps进阶之路~

今年以来,我们注意到越来越多的单位开始积极实践FinOps,而随着FinOps的发展,大家对于其落地过程的关注也更加具体和深入,涉及了账单波动、FinOps的边际效应、成本模型、依赖工具等多个关键问题。 本月「UGeek大咖说」线上直播活动…

【网络协议】Http-中

搜索引擎:搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上采集信息,在对信息进行组织和处理后,为用户提供检索服务,将检索的相关信息展示给用户的系统。搜索引擎是工作于互联网上的一门检索技术,它旨在提…

表格内日期比较计算

需求&#xff1a;在表格中新增数据&#xff0c;计算开始日期中最早的和结束日期中最晚的&#xff0c;回显到下方。 <el-formref"formRef":model"ruleForm":rules"rules"style"margin-top: 20px;"label-position"top">…

SpringMVC+统一表现层返回值+异常处理器

一、统一表现层返回值 根据我们不同的处理方法&#xff0c;返回的数据格式都会不同&#xff0c;例如添加只返回true|false&#xff0c;删除同理&#xff0c;而查询却返回数据。 Result类 为此我们封装一个result类来用于表现层的返回。 public class Result {//描述统一格式…

vscode调试webpack项目的方法

vscode调试webpack项目的方法 首先安装vscode插件Javascript Debugger 这个插件的介绍也写清楚了&#xff1a; An extension for debugging Node.js programs and Chrome. 那就是用来调试Node.js和Chrome的vscode扩展插件&#xff0c;包括typescript. 然后按F5启动调试&…

力扣每日一题(+日常水几道题)

每日一题1333. 餐厅过滤器 - 力扣&#xff08;LeetCode&#xff09; 简单的按规则排序,去除几个不满足的条件然后排序返回即可 #include<algorithm> class Solution { public:vector<int> filterRestaurants(vector<vector<int>>& restaurants, …

嵌入式Linux应用开发-第七章-IMX6ULL-QEMU的LED驱动程序

嵌入式Linux应用开发-第七章-IMX6ULL-QEMU的LED驱动程序 IMX6ULL-QEMU的 LED驱动程序7.5 IMX6ULL-QEMU的 LED驱动程序7.5.1 看原理图确定引脚及操作方法7.5.2 所涉及的寄存器操作7.5.3 写程序7.5.4 上机实验7.5.5 课后作业 IMX6ULL-QEMU的 LED驱动程序 7.5 IMX6ULL-QEMU的 LED驱…

Ros2 学习02- ubuntu22.04 安装ros2

设置镜像源 sudo vim /etc/apt/sources.list#阿里源 deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jamm…

Sentinel结合Nacos实现配置持久化(全面)

1、前言 我们在进行分布式系统的开发中&#xff0c;无论是在开发环境还是发布环境&#xff0c;配置一定不能是内存形式的&#xff0c;因为系统可能会在中途宕机或者重启&#xff0c;所以如果放在内存中&#xff0c;那么配置在服务停到就是就会消失&#xff0c;那么此时就需要重…

ITSM和ITIL有什么区别?

ITIL是最广泛接受的ITSM方法&#xff0c;是用于管理组织IT运营和服务的最佳实践和建议的框架。它是由英国政府的中央计算机和电信局&#xff08;CCTA&#xff09;在1980年代中期委托创建的。基于ITIL框架构建的ITSM流程为更好的IT服务和改善业务铺平了道路。总而言之&#xff0…

【C#】.Net基础语法一

目录 一、程序集信息 【1.1】Properties中AssemblyInfo文件 二、.Net程序的两次编译过程 三、.Net中命名空间和类 【3.1】引入命名空间 【3.2】修改默认的命名空间 【3.3】命名空间的总结 四、.Net中数据类型 【4.1】数值型 【4.2】非数值型 五、.Net中变量 【5.1】…

零代码编程:用ChatGPT批量自动下载archive.org上的音频书

http://archive.org 是一个神奇的网站&#xff0c;可以下载各种古旧的软件、书籍、音频、视频&#xff0c;还可以搜索各个网站的历史网页。 比如说&#xff0c;一些儿童故事音频就可以在http://archive.org下载到&#xff0c;可以用来做英语听力启蒙用。 举个例子&#xff0c…

vue3 和vue2 的比较

文章目录 生命周期多根节点Composition API组合式APIOptions API与composition API对比优化逻辑组织优化逻辑复用 异步组件(Suspense)Suspense组件 响应式原理性能体积优化编译优化diff算法优化静态提升数据劫持&#xff08;响应式系统&#xff09;优化 生命周期 vue3在组合AP…

【面试经典 150 | 滑动窗口】串联所有单词的子串

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;两个哈希表方法二&#xff1a;滑动窗口 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一…