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

Redis基本命令和常用数据类型_第1张图片

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

move key 是数据库编号

Redis基本命令和常用数据类型_第2张图片
将数据库0中的name移到数据库1中

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

expire key 时间

setex 键名称 生存时间 值

Redis基本命令和常用数据类型_第3张图片
在这里插入图片描述

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

8.查看键值生存时间

ttl key

Redis基本命令和常用数据类型_第4张图片

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

9.查看当前数据库大小

dbsize

Redis基本命令和常用数据类型_第5张图片
代码中就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

Redis基本命令和常用数据类型_第6张图片

(5)批量赋值

mset key1 value1 key2 value2…

Redis基本命令和常用数据类型_第7张图片
有一个赋值出错不会影响其他的赋值

(6)原子性批量赋值

msetnx k1 v1 k2 v2 k3 v3…

Redis基本命令和常用数据类型_第8张图片

(7)追加字符串

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

append key value

Redis基本命令和常用数据类型_第9张图片
Redis基本命令和常用数据类型_第10张图片

(8)获取字符串长度

strlen key

Redis基本命令和常用数据类型_第11张图片

(9)获取指范围字符串

getrange key start end

Redis基本命令和常用数据类型_第12张图片>
getrange key 0 -1相当于get key
Redis基本命令和常用数据类型_第13张图片

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

setrange key start value

Redis基本命令和常用数据类型_第14张图片

(11)设置对象

set 对象

两种:
在这里插入图片描述
Redis基本命令和常用数据类型_第15张图片

(12)先get后set

getset key value

Redis基本命令和常用数据类型_第16张图片
nil说明没有这个key,所以直接赋值

(13)自增+1

incr key

Redis基本命令和常用数据类型_第17张图片

(14)指定步长增加

incrby key 数字

Redis基本命令和常用数据类型_第18张图片

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

decr
decrby

2.list

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

(1)插入

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

Redis基本命令和常用数据类型_第19张图片
Redis基本命令和常用数据类型_第20张图片

(2)指定下标赋值

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

Redis基本命令和常用数据类型_第21张图片

(3)查看列表

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

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

Redis基本命令和常用数据类型_第22张图片

(4)下标获取值

lindex 名称 index

在这里插入图片描述

(5)返回列表长度

Llen 名称

在这里插入图片描述

(6)移除

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

Redis基本命令和常用数据类型_第23张图片

(7)截取

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

Redis基本命令和常用数据类型_第24张图片

(8)移动

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

在这里插入图片描述

(9)列表是否存在

exists 名称

在这里插入图片描述

3.set

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

(1)添加

Sadd 名称 value

在这里插入图片描述

(2)取值

Smembers
查看所有值

在这里插入图片描述

(3)随机获取元素

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

在这里插入图片描述

(4)随机删除

Spop 名称

在这里插入图片描述

(5)指定删除

Srem 名称 value

在这里插入图片描述

(6)元素是否存在

Sismember 名称 value

Redis基本命令和常用数据类型_第25张图片

(7)元素个数

Scard 名称

在这里插入图片描述

(8)移动

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

Redis基本命令和常用数据类型_第26张图片

(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

在这里插入图片描述
Redis基本命令和常用数据类型_第27张图片

(3)指定删除

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

(4)获取数量

hlen 名称
key-value算一个长度

Redis基本命令和常用数据类型_第28张图片

(5)字段是否存在

HEXISTS 名称 key

(6) 自增

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

Redis基本命令和常用数据类型_第29张图片

5.Zset

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

(1)赋值

Zadd 名称 数值 value…
Redis基本命令和常用数据类型_第30张图片

(2)获取

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

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

(3)获取元素个数

Zcard 名称

Redis基本命令和常用数据类型_第31张图片

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

Zcount 名称 begin end //下标

Redis基本命令和常用数据类型_第32张图片

(5)删除

Zrem 名称 value
移除指定元素

Redis基本命令和常用数据类型_第33张图片

(6)排序获取

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

Redis基本命令和常用数据类型_第34张图片

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

Redis基本命令和常用数据类型_第35张图片

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
返回位置名称和经纬度

Redis基本命令和常用数据类型_第36张图片

count 数字 // 限定寻找个数

在这里插入图片描述

(5)指定范围内元素

georadiusbymember key member 数字 单位

北京10000km内的城市:
Redis基本命令和常用数据类型_第37张图片

(6)经纬度字符串

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

在这里插入图片描述

(7)删除

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

Redis基本命令和常用数据类型_第38张图片

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
Redis基本命令和常用数据类型_第39张图片
有重复部分,所以合并后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

Redis基本命令和常用数据类型_第40张图片

(2)取值

getbit

在这里插入图片描述

(3)统计

bitcount

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


总结

以上就是Redis讲解。

你可能感兴趣的:(Redis,redis,数据库,缓存,后端)