Redis基本命令和常用数据类型

文章目录

  • 前言
  • 一、Redis简介
  • 二、基本操作
    • 1.赋值
    • 2.取值
    • 3.切换数据库
    • 4.查看数据库所有键(key)
    • 5.查看键值类型
    • 6.移动键值到其他数据库
    • 7.设置键值生存时间(两种)
    • 8.查看键值生存时间
    • 9.查看当前数据库大小
    • 10.判断键是否存在
    • 11.清空当前数据库
    • 12.清空所有数据库
  • 三、常用数据类型
    • 1.String(字符串)
      • (1)赋值
      • (2)取值
      • (3)同时获取多个值
      • (4)不存在才赋值
      • (5)批量赋值
      • (6)原子性批量赋值
      • (7)追加字符串
      • (8)获取字符串长度
      • (9)获取指范围字符串
      • (10)替换指定位置开始往后n位字符串
      • (11)设置对象
      • (12)先get后set
      • (13)自增+1
      • (14)指定步长增加
      • (15)递减和指定步长减少
    • 2.list
      • (1)插入
      • (2)指定下标赋值
      • (3)查看列表
      • (4)下标获取值
      • (5)返回列表长度
      • (6)移除
      • (7)截取
      • (8)移动
      • (9)列表是否存在
    • 3.set
      • (1)添加
      • (2)取值
      • (3)随机获取元素
      • (4)随机删除
      • (5)指定删除
      • (6)元素是否存在
      • (7)元素个数
      • (8)移动
      • (9)并集、交集、差集
    • 4.Hash
      • (1)赋值
      • (2)获取
      • (3)指定删除
      • (4)获取数量
      • (5)字段是否存在
      • (6) 自增
    • 5.Zset
      • (1)赋值
      • (2)获取
      • (3)获取元素个数
      • (4)统计指定区间元素数量
      • (5)删除
      • (6)排序获取
    • 6.Geospatial地理位置
      • (1)添加地理位置
      • (2)获取经纬度
      • (3)获取两个位置距离
      • (4)半径内元素查询
      • (5)指定范围内元素
      • (6)经纬度字符串
      • (7)删除
    • 7.Hyperloglog基数统计
      • (1)添加
      • (2)获取基数值
      • (3)并集合并
    • 8.Bitmap位图
      • (1)添加
      • (2)取值
      • (3)统计
  • 总结


前言

Redis基本命令和常用数据类型(String、List、Set、Hash、Zset、Geospatial、Hyperloglog)。


一、Redis简介

Redis(Remote Dictionary Server ),即远程字典服务
Redis 是一个开源(BSD 许可)内存数据结构存储,用作数据库、缓存、消息代理和流引擎。Redis 提供数据结构,例如字符串、哈希、列表、集、带有范围查询的排序集、位图、超日志日志、地理空间索引和流。 Redis 具有内置复制、Lua 脚本、LRU 逐出、事务和不同级别的磁盘持久性,并通过 Redis Sentinel 和 Redis 集群的自动分区提供高可用性。

Redis是单线程的!

官方表示Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使单线程,就使用单线程了。Redis是C语言写的,官方提供的数据为100000+QPS,完全不比同样使用key-value的Memecache差!

Redis为什么单线程还这么快?

1、误区1:高性能的服务器其一定是多线程的
2、误区2:多线程(会发生CPU上下文交换!一定比单线程效率高!

核心:Redis是将所有的数据全部放在内存中的,所有说使用单线程去操作是最高的,多线程(CPU上下文会切换:耗时的操作!!),对于内存系统来说,如果没有上下文切换效就是最高的,多次读写都在一个CPU上的,在内存情况下这个就是最佳方案。

NoSQL

NoSQL(Not Only SQL),即不仅是SQL,泛指非关系型数据库。

NoSQL 易扩展,NoSQL 数据库种类繁多(MongoDB、Redis 等),共同的特点都是去掉关系数据库的关系型特性。

数据之间无关系,这样就非常容易扩展,无形之间也在架构的层面上带来了可扩展的能力。

大数据量下 NoSQL 数据库具有非常高的读写性能,这得益于它的无关系性,数据库的结构简单。

NoSQL 数据库的典型代表就是 Redis。

二、基本操作

1.赋值

set key value

在这里插入图片描述

2.取值

get key

在这里插入图片描述

3.切换数据库

  • Redis 默认有 16 个数据库。
  • 默认使用的是第 0 个数据库。
  • 不同数据库存不同的值。

select

切换到数据库1:
在这里插入图片描述
这个数据库0:
在这里插入图片描述
上面讲诉赋值操作,我们在数据库0中已经赋值dragon,在数据库1中是没有的:
在这里插入图片描述

4.查看数据库所有键(key)

keys *

在这里插入图片描述

5.查看键值类型

type key

在这里插入图片描述

6.移动键值到其他数据库

move key 是数据库编号

在这里插入图片描述
将数据库0中的name移到数据库1中

7.设置键值生存时间(两种)

expire key 时间

setex 键名称 生存时间 值

在这里插入图片描述
在这里插入图片描述

这里是设置10秒生存时间。

8.查看键值生存时间

ttl key

在这里插入图片描述

上面设置的生存时间,用ttl查看,-2说明已经过期。(我输入命令查看的时候耽误了一些时间,所以最开始是还剩4秒生存时间)

9.查看当前数据库大小

dbsize

在这里插入图片描述
代码中就k1一个元素,所以数据库大小为1

10.判断键是否存在

exists key

在这里插入图片描述

11.清空当前数据库

flushdb

12.清空所有数据库

flushall

三、常用数据类型

1.String(字符串)

(1)赋值

set key name

(2)取值

get key

(3)同时获取多个值

mset key1 key2…

(4)不存在才赋值

setnx key value

在这里插入图片描述

(5)批量赋值

mset key1 value1 key2 value2…

在这里插入图片描述
有一个赋值出错不会影响其他的赋值

(6)原子性批量赋值

msetnx k1 v1 k2 v2 k3 v3…

在这里插入图片描述

(7)追加字符串

如果当前字符串不存在,则相当于set key

append key value

在这里插入图片描述
在这里插入图片描述

(8)获取字符串长度

strlen key

在这里插入图片描述

(9)获取指范围字符串

getrange key start end

在这里插入图片描述>
getrange key 0 -1相当于get key
在这里插入图片描述

(10)替换指定位置开始往后n位字符串

setrange key start value

在这里插入图片描述

(11)设置对象

set 对象

两种:
在这里插入图片描述
在这里插入图片描述

(12)先get后set

getset key value

在这里插入图片描述
nil说明没有这个key,所以直接赋值

(13)自增+1

incr key

在这里插入图片描述

(14)指定步长增加

incrby key 数字

在这里插入图片描述

(15)递减和指定步长减少

decr
decrby

2.list

在Redis里面,我们可以把lis玩成栈、队列、阻塞队列。
lis命令都是以 l 开。
list 实际是一个链表,左右都可以插入值。
如果 key 不存在,创建新的链表。
如果移除了所有元素,空链表也代表不存在。
在两边插入或者改动值,效率最高;操作中间元素,效率相对低一些。
应用场景:消息排队

(1)插入

LPUSH 从左边插入一个或多个值
RPUSH 从右边插入一个或多个值
LINSERT 名称 before/after value1 vlaue2 在value1前插入value2

在这里插入图片描述
在这里插入图片描述

(2)指定下标赋值

Lset 名称 index value
如果列表不存在或者列表指定下标不存在,赋值失败。

在这里插入图片描述

(3)查看列表

LRANGE 名称 begin end 查看区间数据 [begin,end]

begin = 0 ,end = -1是查看全部。

在这里插入图片描述

(4)下标获取值

lindex 名称 index

在这里插入图片描述

(5)返回列表长度

Llen 名称

在这里插入图片描述

(6)移除

Lpop 从左边移除
Rpop 从右边移除
Lrem 名称 数量 value //移除指定数量的value

在这里插入图片描述

(7)截取

Ltrim 名称 begin end
截取区内的元素

在这里插入图片描述

(8)移动

Rpoplpush 名称 另一个列表
移动列表的最后一个元素带新列表中

在这里插入图片描述

(9)列表是否存在

exists 名称

在这里插入图片描述

3.set

Set 中的值是不能重复的
命令都是以 s 开头
应用场景:共同关注

(1)添加

Sadd 名称 value

在这里插入图片描述

(2)取值

Smembers
查看所有值

在这里插入图片描述

(3)随机获取元素

SRANDMEMBER 名称
随机获取集合中的元素

在这里插入图片描述

(4)随机删除

Spop 名称

在这里插入图片描述

(5)指定删除

Srem 名称 value

在这里插入图片描述

(6)元素是否存在

Sismember 名称 value

在这里插入图片描述

(7)元素个数

Scard 名称

在这里插入图片描述

(8)移动

Smove set1 set2 hello
移动 set1 中的 hello 到 set2 中(set2 不存在则创建set2集合并移动)

在这里插入图片描述

(9)并集、交集、差集

SDIFF 名称1 名称2 //差集
SINTER 名称1 名称2 //交集
SUNION 名称1 名称2 //并集

4.Hash

哈希就是 key - map 的数据结构
应用场景:对象存储

(1)赋值

hset 名称 key1 value1 key2 value2…

在这里插入图片描述

(2)获取

hmget 名称 key1 key2… //获取多个
hget 名称 key //获取一个
hgetall 名称 //获取全部
hkeys //获取全部key
hvals //获取全部value

在这里插入图片描述
在这里插入图片描述

(3)指定删除

hdel 名称 key
对应的value也会删除

(4)获取数量

hlen 名称
key-value算一个长度

在这里插入图片描述

(5)字段是否存在

HEXISTS 名称 key

(6) 自增

Hincrby 名称 key 步长(可以是负数)

在这里插入图片描述

5.Zset

Zset 就是 Set 的有序集合
应用场景:排行榜

(1)赋值

Zadd 名称 数值 value…
在这里插入图片描述

(2)获取

Zrange 名称 begin end //下标
区间为0、-1为查询全部

注意观察数据已经按照数值排序了(默认从大到小):
在这里插入图片描述

(3)获取元素个数

Zcard 名称

在这里插入图片描述

(4)统计指定区间元素数量

Zcount 名称 begin end //下标

在这里插入图片描述

(5)删除

Zrem 名称 value
移除指定元素

在这里插入图片描述

(6)排序获取

Zrevrange 名称 begin end //从小到大// 区间是下标
Zrangebyscore 名称 begin end //从大到小 // 区间是值数据key的范围并不是下标 // -inf代表负无穷 +inf 代表正无穷

在这里插入图片描述

Zrangebyscore 名称 begin end witscores //从大到小显示并附带key的数据

在这里插入图片描述

6.Geospatial地理位置

edis 的 GEO 特性在 3.2 版本中推出, 这个功能可以将用户给定的地理位置信息储存起来。
通常用以实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。
geo 的数据类型为 zset。
GEO 的数据结构总共有六个常用命令:geoadd、geopos、geodist、georadius、georadiusbymember、gethash
有效经度从-180度到180度
有效纬度从-85.05112878到85.05112878
当坐标位置超过上诉范围,会报错。
一般我们会直接下载城市数据,直接通过Java导入。

(1)添加地理位置

geoadd key 经度 维度 member
将给定的空间元素(纬度、经度、名字)添加到指定的键里面。
geoadd 命令以标准的x,y格式接受参数,所以用户必须先输入经度,然后再输入纬度。
geoadd 能够记录的坐标是有限的:非常接近两极的区域无法被索引。

在这里插入图片描述
在这里插入图片描述

(2)获取经纬度

一定是一个坐标值
geopos key member

在这里插入图片描述

(3)获取两个位置距离

geodist key member1 member2
是直线距离,默认是米
单位:

  • km(千米)
  • m(米)
  • mi(英里)
  • ft(英尺)

在这里插入图片描述
在这里插入图片描述

(4)半径内元素查询

georadius key 经度 纬度 半径

乱码报错:
在这里插入图片描述

解决办法:在连接时,redis-cli --raw增加–raw参数,强制输出中文。

在 china:city 中寻找坐标 100 30 半径为 1000km 的城市:
在这里插入图片描述

georadius key 经度 纬度 半径 withdist
返回位置名称和距中心直线距离

在这里插入图片描述

georadius key 经度 纬度 半径 withcoord
返回位置名称和经纬度

在这里插入图片描述

count 数字 // 限定寻找个数

在这里插入图片描述

(5)指定范围内元素

georadiusbymember key member 数字 单位

北京10000km内的城市:
在这里插入图片描述

(6)经纬度字符串

geohash
将二维经纬度转换为一维字符串,字符串越长表示位置更精确,两个字符串越相似表示距离越近。

在这里插入图片描述

(7)删除

GEO 没有提供删除成员的命令,但是因为 GEO 的底层实现是 zset,所以可以借用 zrem 命令实现对地理位置信息的删除。
zrem
zrange

在这里插入图片描述

7.Hyperloglog基数统计

Redis 在 2.8.9 版本添加了 HyperLogLog 结构,用来做基数统计的算法
其优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的,并且是很小的。
每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2 ^ 64 个不同元素的基数。
HyperLogLog 是一种算法,它提供了不精确的去重计数方案
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8},基数(不重复元素)为 5。

比如统计网页的浏览用户数量,一天内同一个用户多次访问只算一次。
传统的解决方案是使用 Set 来保存用户 id,然后统计 Set 中的元素数量。
这种方案只能承载少量用户,一旦用户数量大起来就需要消耗大量的空间。
而且目的是统计用户数量而不是保存用户,这是个吃力不讨好的方案。
使用 HyperLogLog 最多需要 12k 就可以统计大量的用户数。
尽管它大概有 0.81% 的错误率,但对于统计用户数量这种不需要很精确的数据是可以忽略不计的。

(1)添加

PFadd
在这里插入图片描述
在这里插入图片描述

(2)获取基数值

PFCOUNT

在这里插入图片描述
在这里插入图片描述

(3)并集合并

pfmerge

mykey和mykey2取并集,得到并集mykey3
在这里插入图片描述
有重复部分,所以合并后15个。

8.Bitmap位图

Redis 从 2.2 版本增加了 Bitmap(位图)
如果使用普通的 key / value存储,则要记录 365 条记录,如果用户量很大,需要的空间也会很大。
Redis 提供了 Bitmap 位图这种数据结构,Bitmap 就是通过操作二进制位来进行记录,即为 0 和 1。
如果要记录 365 天的打卡情况,使用 Bitmap 表示的形式大概如下:0101000111000111……
这样 365 天相当于 365 bit,又 1 字节 = 8 bit , 所以相当于使用 46 个字节即可。
BitMap 就是通过一个 bit 位来表示某个元素对应的值或者状态,其中的 key 就是对应元素本身。
实际上底层也是通过对字符串的操作来实现的。

(1)添加

setbit

在这里插入图片描述

(2)取值

getbit

在这里插入图片描述

(3)统计

bitcount

只有2个值为1:
在这里插入图片描述


总结

以上就是Redis讲解。

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

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

相关文章

洛谷 P1216 [USACO1.5] [IOI1994]数字三角形题解

观察题目我们发现从前往后推会有条件判断&#xff0c;不容易写出来。所以就从后往前推。 也就是说后面的状态已经是推出来了&#xff0c;保证是最大值。 //数字三角形 #include<iostream> using namespace std; const int N 510; int f[N][N], n;int main() {ios::sync…

转行做程序员,多晚都不晚

大家好啊&#xff0c;我是董董灿。 最近有不少小伙伴加我微信咨询一些问题&#xff0c;有同学想了解AI行业的现状&#xff0c;想着转行的&#xff0c;也有在校生想了解毕业后工作方向的&#xff0c;当然也有想学习编程知识的。 诚惶诚恐&#xff0c;没想到之前写的文章&#…

Go开始:Go基本元素介绍

标识符与关键字 在任何编程语言中&#xff0c;标识符和关键字都是核心概念&#xff0c;Go也不例外。标识符用于命名各种类型的代码元素&#xff0c;如变量、常量、函数等。关键字是预留的词汇&#xff0c;用于指示编程语言的特定操作。在本部分中&#xff0c;我们将详细介绍Go语…

如何使用BERT生成单词嵌入?

阿比贾特萨拉里 一、说明 BERT&#xff0c;或来自变形金刚&#xff08;Transformer&#xff09;的双向编码器表示&#xff0c;是由谷歌开发的强大语言模型。它已广泛用于自然语言处理任务&#xff0c;例如情感分析、文本分类和命名实体识别。BERT的主要特征之一是它能够生成单词…

Servlet的生命周期

2023.10.18 WEB容器创建的Servlet对象&#xff0c;这些Servlet对象都会被放到一个集合当中&#xff08;HashMap&#xff09;&#xff0c;这个集合当中存储了Servlet对象和请求路径之间的关系 。只有放到这个HashMap集合中的Servlet才能够被WEB容器管理&#xff0c;自己new的Ser…

【经历】跨境电商公司目前已在职近2年->丰富且珍贵

我入职了跨境电商公司 *背景 上篇说我在2021-11月离职了&#xff0c;交接期间已经拿到了新公司的offer&#xff0c;然后因上家公司项目交接时间比较长(原因在上篇)&#xff0c;导致新公司这边延迟了两次入职的时间&#xff0c;最后结果是直接无缝衔接了新公司&#xff08;周五…

HTML5有哪些新特性?移除了哪些元素?

HTML5引入了许多新特性&#xff0c;以下是其中一些主要的新特性&#xff1a; 1&#xff1a;语义化元素&#xff1a;HTML5引入了一些新的语义化元素&#xff0c;如 <header>、<footer>、<nav>、<article>、<section>等&#xff0c;使得页面结构…

Python学习第3天-第一个Python程序

文章目录 前言一、创建项目二、创建程序总结 前言 下面给大家展示下经典的Hello World! 一、创建项目 二、创建程序 print("Hello World!")总结 回到顶部 学习网站 欢迎来到Python的世界&#xff01;

从头开始机器学习:逻辑回归

一、说明 本篇实现线性回归的先决知识是&#xff1a;基本线性代数&#xff0c;微积分&#xff08;偏导数&#xff09;、梯度和、Python &#xff08;NumPy&#xff09;&#xff1b;从线性方程入手&#xff0c;逐渐理解线性回归预测问题。 二、逻辑回归简介 我们将以我们在线性回…

C嘎嘎之类和对象上

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;掌握类的引用和定义&#xff0c;熟悉类成员函数的…

arrow(c++)改写empyrical系列1---用arrow读取基金净值数据并计算夏普率

用arrow c版本读取了csv中的基金净值数据&#xff0c;然后计算了夏普率&#xff0c;比较尴尬的是&#xff0c;arrow c版本计算耗费的时间却比python的empyrical版本耗费时间多。。。 arrow新手上路&#xff0c;第一次自己去实现功能&#xff0c;实现的大概率并不是最高效的方…

【(数据结构)— 双向链表的实现】

&#xff08;数据结构&#xff09;— 双向链表的实现 一.双向链表的结构二. 双向链表的实现2.1 头文件 ——双向链表的创建及功能函数的定义2.2 源文件 ——双向链表的功能函数的实现2.3 源文件 ——双向链表功能的测试2.4 双向链表各项功能测试运行展示2.4.1 双向链表的初始化…

git切换远程仓库源步骤

git切换远程仓库源步骤&#xff1a; 第一步&#xff1a;git remote -v 查看当前远程仓库源&#xff1a; 第二步&#xff1a;git remote rm origin删除远程仓库源&#xff1b; 第三步&#xff1a;git remote add origin http://newURL.git 添加新的远程仓库源地址&#xff1b…

云安全—分布式基础

0x00 前言 云必然是依赖于分布式技术来进行实现的&#xff0c;所以有必要学习和来了解分布式相关的内容 0x01 分布式计算 1.基本概述 分布式计算的定义&#xff1a;通过网络互联的计算机都具有一定的计算能力&#xff0c;他们之间互相传递数据&#xff0c;实现信息共享&…

用3D扫描生成合成数据

合成数据集&#xff08;Synthetic Datasets&#xff09;正在成为计算机视觉模型训练的标准部分。 虽然新工具使合成数据集变得更容易访问&#xff0c;但除了标准机器学习过程之外&#xff0c;许多工具还需要对 3D 建模有基本的了解。 最简单的捷径是从现实世界中获取现有对象并…

Vue中的v-if和v-show指令有什么区别?

在Vue中,v-if和v-show是两个常用的指令,用于根据条件控制元素的显示和隐藏。虽然它们都可以根据条件来切换元素的可见性,但它们的实现和行为有一些区别。 1:编译时机: v-if是在编译阶段进行条件判断,如果条件为false,则在DOM中不会渲染该元素及其子元素;v-show则是在运…

基于材料生成优化的BP神经网络(分类应用) - 附代码

基于材料生成优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于材料生成优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.材料生成优化BP神经网络3.1 BP神经网络参数设置3.2 材料生成算法应用 4.测试结果…

28 mysql 数据记录的 存储更新删除

前言 前面 我们探讨了 索引记录的 新增, 更新, 删除 这里 我们来看一下 mysql 的核心数据记录的 新增更新删除 这里 来看一下 增删改 的相关实现 数据记录 和 索引记录 的处理方式是一致的 mysql 数据记录的存储 新增部分参见 自增长主键的实现 以及 记录的插入 mysql…

keep-alive 是 Vue 的一个内置组件,用于缓存其他组件的实例,以避免重复渲染和销毁,它可以在需要频繁切换的组件之间提供性能优化

目录 keep-alive 使用 keep-alive 的示例代码&#xff1a; 手动清除组件缓存的示例代码&#xff1a; keep-alive 组件有以下几个优点&#xff1a; keep-alive 的原理&#xff1a; 使用 keep-alive 组件&#xff0c;你可以包裹需要缓存的组件&#xff0c;然后这些组件在切…

1.3 矩阵

一、向量与矩阵 下面是三个向量 u \boldsymbol u u、 v \boldsymbol v v、 w \boldsymbol w w&#xff1a; u [ 1 − 1 0 ] v [ 0 1 − 1 ] w [ 0 0 1 ] \boldsymbol u\begin{bmatrix}\,\,\,\,1\\-1\\\,\,\,\,0\end{bmatrix}\kern 10pt\boldsymbol v\begin{bmatrix}\,\,\,…