Redis——三个特殊的数据类型+事务

news2024/11/25 14:56:10

概述

全称为远程字典服务。

Redis——基础篇(包含redis在云服务上的docker化安装和连接以及常用命令)_连接docker中的redis_北岭山脚鼠鼠的博客-CSDN博客

Redis能干什么?

1.内存存储、持久化,内存中是断电即失,因此持久化很重要(rdb,aof)

2.效率高,可以用于高速缓存。

3.发布订阅系统

4.地图信息分析

5.计时器,计数器(浏览量)

6. ...

三种特殊数据类型

geospatial地理位置

朋友的定位,附近的人,打车距离计算

Redis的geo可以推算地理位置的信息,两地之间的距离,方圆几里之内的人。

六个命令

  • geoadd:添加地理位置的坐标。
  • geopos:获取地理位置的坐标。
  • geodist:计算两个位置之间的距离。
  • georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
  • georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
  • geohash:返回一个或多个位置对象的 geohash 值。

geoadd

城市经纬度查询-国内城市经度纬度在线查询工具

geoadd 用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。

geoadd 语法格式如下:

GEOADD key longitude latitude member [longitude latitude member ...]
#添加单条数据
geoadd china:city 116 39 beijing
#添加多条数据
geoadd china:city 113.28 23.12 guangzhou 121.47 31.23 shanghai

  

geopos

geopos 用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回null

语法格式如下

GEOPOS key member [member ...]
#查询单条数据
geopos china:city beijing
#查询多条数据
geopos china:city beijing shanghai

 geodist

geodist 用于返回两个给定位置之间的距离。

geodist 语法格式如下:

GEODIST key member1 member2 [m|km|ft|mi]

member1 member2 为两个地理位置。

最后一个距离单位参数说明:

  • m :米,默认单位。
  • km :千米。
  • mi :英里。
  • ft :英尺。
geodist china:city beijing shanghai

 

georadius、georadiusbymember

georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

georadiusbymember 和 georadius 命令一样, 都可以找出位于指定范围内的元素, 但是 georadiusbymember 的中心点是由给定的位置元素决定的, 而不是使用经度和纬度来决定中心点。

georadius 与 georadiusbymember 语法格式如下:

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

  • m :米,默认单位。
  • km :千米。
  • mi :英里。
  • ft :英尺。
  • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
  • WITHCOORD: 将位置元素的经度和纬度也一并返回。
  • WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
  • COUNT 限定返回的记录数。
  • ASC: 查找结果根据距离从近到远排序。
  • DESC: 查找结果根据从远到近排序。
georadius china:city 110 30 2000 km WITHDIST

georadiusbymember china:city shanghai 2000 km withdist

 geohash

Redis GEO 使用 geohash 来保存地理位置的坐标。

geohash 用于获取一个或多个位置元素的 geohash 值。

geohash 语法格式如下:

GEOHASH key member [member ...]

 删除位置

geo底层用的是zset实现

查看
zrange china:city 0 -1
删除
zrange china:city guangzhou

Hyperloglog

什么是基数?不重复的元素的个数

A{1,3,5,7,8,7} =5    

B{1,3,517,8}  =5

redis Hyperloglog 基数统计的算法

应用场景:

网页的UV(一个人访问一个网站多次,但是还是算作一个人)

传统方式,set保存用户id.

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

pfadd 

Redis Pfadd 命令将所有元素参数添加到 HyperLogLog 数据结构中。

PFADD key element [element ...]
pfadd mykey 1 2 3 4 4

 

pfcount

Redis Pfcount 命令返回给定 HyperLogLog 的基数估算值。

PFCOUNT key [key ...]
pfcount mykey

pfmerge

Redis PFMERGE 命令将多个 HyperLogLog 合并为一个 HyperLogLog ,合并后的 HyperLogLog 的基数估算值是通过对所有 给定 HyperLogLog 进行并集计算得出的。

PFMERGE destkey sourcekey [sourcekey ...]

 

Bitmaps位存储

setbit

Redis Setbit 命令用于对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。

Setbit KEY_NAME OFFSET
redis> SETBIT bit 10086 1
(integer) 0

redis> GETBIT bit 10086
(integer) 1

redis> GETBIT bit 100   # bit 默认被初始化为 0
(integer) 0

 Getbit 

Redis Getbit 命令用于对 key 所储存的字符串值,获取指定偏移量上的位(bit)。

GETBIT KEY_NAME OFFSET
redis> GETBIT bit 10086
(integer) 0

 Bitcount

统计一个key里面对应的1有多少

bitcount bit

 Redis事务本质:一组命令的集合,一个事务的所有命令都会被序列化,执行时,会按照顺序执行

一次性,顺序性,排他性。

Redis单条命令是保证原子性的,但是事务不保证原子性。

Redis不存在隔离级别的概念。

执行事务

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

  • 开始事务。(multi)
  • 命令入队。(其他命令)
  • 执行事务。(exec)

 关闭事务

编译型异常

代码问题、命令有错

所有命令都不会执行

运行时异常 

字符串无法加1,所以失败了。但是其他的正常执行了。

 监控

悲观锁

无论任何操作都加锁,影响性能。

乐观锁

认为什么时候都不会出问题,所以不会上锁。

更新数据的时候去判断一下,在此期间是否有人修改过这个锁。

获取version,更新时比较version

redis的监视测试

正常监视

 测试多线程修改值时,使用watch可以当做redis的乐观锁。

一个进程在watch之后进了事物,还没执行时,另一个进程在执行时就会修改失败。

 想要成功可以直接unwatch解锁,然后再次watch监视.

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

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

相关文章

C++ 虚继承

C棱形继承 在 C 中,在使用 多继承 时,如果发生了如果类 A 派生出类 B 和类 C,类 D 继承自类 B 和类 C,这时候就发生了菱形继承。 如果发生了菱形继承,这个时候类 A 中的 成员变量 和 成员函数 继承到类 D 中变成了两…

开源可商业运营的ChatGpt网页源码v1.2.2

🤖 主要功能 后台管理系统,可对用户,Token,商品,卡密等进行管理 精心设计的 UI,响应式设计 极快的首屏加载速度(~100kb) 支持Midjourney绘画和DALLE模型绘画,GPT4等应用 海量的内置 prompt 列表,来自中文和英文 一键导…

CV_tutorial1

CV Entry-Level Recurrent Neural Networks序列数据sequence data语言模型languag model循环神经网络recurrent neural networks门控循环单元gated recurrent unit长短期记忆网络long short-term memory OpenCV 图形图像操作文档矫正Gamma变化开运算 传统图像分割分水岭算法 Re…

NX/UG二次开发—建模—文字中心线提取思路简介

一、中心线提取 1、离散文字平面: 离散文字平面,构建一个二维矩阵数组(实际操作时用的一维数组) 1.1最小边界盒子: 可以计算文字平面的最小边界盒子,然后按步距在平面上采点,优点是点距比较…

【TODO】米哈游20230813笔试第三题

是计算抽中什么当期五星的期望。 现在的程序结果是99.6087。结果不对&#xff0c;有时间再调。 #include <iostream> #include <bits/stdc.h> typedef long long LL; using namespace std;int n 90; double p; // double min_p 1e-7; double min_p 0.0000000000…

根据源码,模拟实现 RabbitMQ - 通过 SQLite + MyBatis 设计数据库(2)

目录 一、数据库设计 1.1、数据库选择 1.2、环境配置 1.3、建库建表接口实现 1.4、封装数据库操作 1.5、针对 DataBaseManager 进行单元测试 一、数据库设计 1.1、数据库选择 MySQL 是我们最熟悉的数据库&#xff0c;但是这里我们选择使用 SQLite&#xff0c;原因如下&am…

什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?

文章目录 前言我们为什么要使用线程而不是进程来实现并发编程什么是线程进程和线程的区别如何使用Java实现多线程创建线程1.创建一个继承 Thread 类的线程类2.实现 Runnable 接口匿名内部类方式实现 Runnable 接口lambda 表达式实现 Runnable 接口 Thread 类的常见构造方法Thre…

NO.1 MyBatis配置文件:配置连接数据库的环境,实现数据库连接

目录 1、MyBatis配置数据库环境的连接方式 1.1连接方式一&#xff1a;MyBatis核心配置文件配置数据库连接信息 1.2连接方式二&#xff1a;在MyBatis核心配置文件中引入properties文件&#xff0c;配置数据库的环境 2、MyBatisd核心配置文件连接数据库的环境完整配置信息 3…

基于Matlab实现心电信号小波特征提取和对应疾病识别仿真(附上源码+数据集)

本文基于Matlab平台&#xff0c;研究了心电信号的小波特征提取方法&#xff0c;并应用于心电信号疾病识别仿真实验中。首先&#xff0c;介绍了心电信号的基本特征和常见的心电疾病。然后&#xff0c;详细阐述了小波变换的原理和方法&#xff0c;并提出了一种基于小波分解和小波…

[Leetcode] [Tutorial] 多维动态规划(未完待续)

文章目录 62. 不同路径Solution 62. 不同路径 一个机器人位于一个 m ∗ * ∗ n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。 问总共有多少条不同的路径&#xff1f; 示例…

线程转换状态,傻傻分不清等待和阻塞吗?你还在暴力的停止线程吗?

线程切换 线程创建之后&#xff0c;调用start()方法开始运行。当线程执行wait()方法之后&#xff0c;线程进入等待状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态&#xff0c;而超时等待状态相当于在等待状态的基础上增加了超时限制&#xff0c;也就是超…

StringJoiner

1、为什么要学习StringJoiner&#xff1f; 2、StringJoiner概述 StringJoiner跟StringBuilder一样&#xff0c;也可以看成一个容器&#xff0c;创建之后里面的内容是可变的。 2.1、作用 提高字符串的操作效率&#xff0c;而且代码编写特别简洁&#xff0c;但是目前市场上很少有…

用友时空KSOA SQL注入漏洞复现(HW0day)

0x01 产品简介 用友时空KSOA是建立在SOA理念指导下研发的新一代产品&#xff0c;是根据流通企业最前沿的I需求推出的统一的IT基础架构&#xff0c;它可以让流通企业各个时期建立的IT系统之间彼此轻松对话&#xff0c;帮助流通企业保护原有的IT投资&#xff0c;简化IT管理&#…

学习笔记整理-JS-03-表达式和运算符

[[toc]] 一、表达式和运算符 1. 表达式 表达式种类 算术、关系、逻辑、赋值、综合 二、JS基本表达式 1. 算术运算符 意义运算符加减-乘*除/取余% 加减乘除 加减的符号和数学一致&#xff0c;乘号是*号&#xff0c;除法是/号默认情况&#xff0c;乘除法的优先级高于加法和…

【软件工程】软件测试

软件测试的对象 软件程序文档 测试对象&#xff1a;各个阶段产生的源程序和文档。 软件测试的目的 基于不同的立场&#xff0c;对软件测试的目的存在着两种完全对立的观点。 &#xff08;1&#xff09;一种观点是通过测试暴露出软件中所包含的故障和缺陷(从用户的角度)&#xf…

ORB-SLAM2第一节---单目地图初始化

单目初始化 1.前提条件&#xff08;640*480&#xff09; 参与初始化的两帧各自的特征点数目都需要大于100.两帧特征点成功匹配的数目需要大于或等于100.两帧特征点三角化成功的三维点数目需要大于50. 2.针对条件三 流程如下 记录当前帧和参考帧&#xff08;第一帧&#xff…

计算机组成原理 汇编语言

..................................................

fastadmin采坑之页面调转

这里有个业务需求&#xff0c;就是一个表格页面添加一个报名按钮&#xff0c;这个报名按钮就对应另外一个表格页面的新增&#xff0c;那就不用单独写个报名页面了&#xff0c;直接添加一个报名按钮&#xff0c;然后按钮的url直接指向另外一个页面的新增页面&#xff0c;真的很方…

[vscode]vscode运行cmake时候exe不执行而且前面多一些字符

遇到一个奇怪问题,你单独打开cmd去执行vscode编译过程序没问题&#xff0c;但是你在vscode确不会执行&#xff0c;这是因为vscode没有读取到电脑环境变量导致加载DLL失败&#xff0c;但是在vscode终端不会给你提示少DLL&#xff0c;需要你自己把DLL复制到exe目录即可解决问题。…

CDH6.3应知应会

文章目录 1. CDH 简介1.1 CDH版本 2. CDH 集群的优势是什么&#xff1f;3. CDH 集群的部署方式有哪些&#xff1f;4. CDH 集群中如何进行故障排除和监控&#xff1f;5. 你有使用 CDH 部署集群的经验吗&#xff1f;6. CDH 集群如何实现高可用性&#xff1f;7. 在 CDH 集群中&…