redis的安装、基础命令及常用数据结构

news2024/10/5 16:28:21

文章目录

  • 前言
  • 一、Redis安装
    • 1.Ubuntu下安装
      • (1)切换到root用户下
      • (2)使用apt安装redis5
      • (3)为了使redis支持远程连接,修改以下地方
      • (4)验证安装是否成功
    • 2.Centos7下安装
      • (1)使用yum,先安装scl源,再安装redis
      • (2)创建符号链接
      • (3)修改配置文件
      • (4)设置工作目录
      • (5)设置日志目录
      • (6)启动redis
      • (7)停止redis
    • 3.Centos8下安装Redis
      • (1)使用yum安装
      • (2)通过systemd管理Redis
      • (3)支持远程连接
      • (4)通过systemd控制redis
  • 二、Redis基础命令
    • 1.get和set
    • 2.keys
    • 3.exists
    • 4.del
    • 5.expire
    • 6.ttl
    • 7.type
  • 三、常用数据类型和编码方式
    • 1.string
      • (1)set和get
      • (2)mset和mget
      • (3)setnx,setex,psetex
      • (4)incr和incrby
      • (5)decr,decrby和incrbyfloat
      • (6)append
      • (7)getrange
      • (8)setrange
      • (9)strlen
      • (10)编码方式
      • (11)应用场景
    • 2.hash
      • (1)hset,hget,hexists,hdel
      • (2)hkeys和hvals
      • (3)hgetall和hmget
      • (4)hlen,hsetnx,hincrby,hincrbyfloat
      • (5)哈希编码方式
      • (6)哈希的应用
    • 3.list
      • (1)lpush和lrange
      • (2)lpushx,rpush,rpushx
      • (3)lpop,rpop
      • (4)lindex,linsert,llen
      • (5)lrem
      • (6)ltrim,lset
      • (7)blpop和brpop
      • (8)编码方式
      • (9)应用场景
    • 4.set
      • (1)sadd,smembers,sismember
      • (2)spop和ssrandmember
      • (3)smove和srem
      • (4)sinter,sinterstore
      • (5)sunion,sunionstore,sdiff,sdiffstore
      • (6)编码方式
      • (7)应用场景
    • 5.zset
      • (1)zadd
      • (2)zcard,zcount
      • (3)zrange,zrevrange,zrangebyscore
      • (4)zpopmax
      • (5)bzpopmax
      • (6)zpopmin,bzpopmin
      • (7)zrank,zrevrank,zscore
      • (8)zrem,zremrangebyrank,zremrangebyscore
      • (9)zincrby
      • (10)zinterstore
      • (11)zunionstore
      • (12)编码方式
      • (13)应用场景
    • 6.补充类型
      • (1)stream
      • (2)geospatial
      • (3)hyperloglog
      • (4)bitmap
      • (5)bitfield
    • 7.渐进式遍历
      • scan
  • 面试题:redis虽然是单线程模型,为什么效率这么高?速度这么快?
  • 四、redis客户端
    • 1.RESP
    • 2.Java客户端
      • (1)引入jedis依赖
      • (2)连接redis服务器


前言

本文记录redis初级学习中的一些知识点,例如:安装过程、基本的命令、数据结构等。


一、Redis安装

ubuntu和centOS下安装redis。

1.Ubuntu下安装

(1)切换到root用户下

sudo -i

或者输入下面命令后输入密码

su root 

(2)使用apt安装redis5

apt search redis       //查看apt下的redis版本
apt install redis -y     //安装redis

(3)为了使redis支持远程连接,修改以下地方

切换到redis目录:cd /etc/redis/
使用vim修改redis.conf文件:vim redis.conf
主要修改以下两个地方:
在这里插入图片描述

(4)验证安装是否成功

a.启动redis服务

service redis-server start

b.关闭redis服务

service redis-server stop

c.重启redis服务

service redis-server restart

2.Centos7下安装

CentOS 7 支持安装redis的最高版本是 redis3,如果要安装redis5需要先安装scl源,具体安装过程如下。

(1)使用yum,先安装scl源,再安装redis

yum install centos-release-scl-rh
yum install rh-redis5-redis

(2)创建符号链接

由于安装目录藏得太深,用起来不方便,所以通过符号链接,把需要用的目录设置到方便的目录中。
针对配置文件修改符号链接:

cd /usr/bin
ln -s /opt/rh/rh-redis5/root/usr/bin/redis-server ./redis-server
ln -s /opt/rh/rh-redis5/root/usr/bin/redis-sentinel ./redis-sentinel
ln -s /opt/rh/rh-redis5/root/usr/bin/redis-cli ./redis-cli

针对配置文件修改符号链接:

cd /etc/
ln -s /etc/opt/rh/rh-redis5/ ./redis

(3)修改配置文件

目的也是为了让redis支持远程连接,修改配置文件redis.conf的以下三个地方:
设置ip地址
关闭保护模式
启动守护进程

(4)设置工作目录

// 创建工作目录
mkdir -p /var/lib/redis
// 在配置文件中,设置工作目录
dir /var/lib/redis

(5)设置日志目录

// 创建日志目录
 mkdir -p /var/log/redis/
 // 在配置文件中,设置日志目录
 logfile /var/log/redis/redis-server.log

(6)启动redis

redis-server /etc/redis/redis.conf

(7)停止redis

a.查看redis-server的pid

ps aux | grep redis

b.使用kill命令直接杀死redis进程

kill 进程id
或者
kill -9 进程id

3.Centos8下安装Redis

需要切换到root用户或者有sudo权限后,再进行安装。

(1)使用yum安装

redis5是被包含在Centos8中,可以使用yum直接安装。

yum install -y redis

(2)通过systemd管理Redis

安装成功后,可以将redis设置为开机自动启动

systemctl enable redis

(3)支持远程连接

和之前的一样。
修改ip

 bind 0.0.0.0

关闭保护模式

protected-mode no # 把 yes 改成 no

(4)通过systemd控制redis

a.启动redis服务

systemctl start redis

验证redis是否正确的监听6379端口:

netstat -nlpt | grep 6379

b.停止redis服务

systemctl stop redis

c.重启redis服务

systemctl restart redis

二、Redis基础命令

1.get和set

在这里插入图片描述

2.keys

redis是键值对结构,key固定就是字符串,value实际上会有很多种类型(字符串、哈希表、列表、集合、有序集合)。
keys返回所有满足样式(pattern)的key。

KEYS pattern

支持如下样式:
(1)?:匹配任意一个字符,例:v?lue匹配value,velue和vxlue;
(2):匹配0个或多个任意字符,例:vlue匹配vlue,vaaaaalue;
(3)[]:只能匹配[]内的字符,其它的不行,例:v[ea]lue匹配velue和value但不匹配vilue;
(4)^:排除某个,其它的都行,例:v[ ^e ]lue匹配velue,vblue,…但不匹配value;
(5)-:给出匹配范围,例:v[a-b]lue匹配value和vblue。
在这里插入图片描述
keys命令在时间复杂度上是o(n),所以,在生产环境上,一般都会禁止使用keys命令。

3.exists

语法:

EXISTS key [key ...]

在这里插入图片描述
时间复杂度:o(1)。(redis组织这些key是按照哈希表的方式来组织的)
返回值:key存在的个数。

4.del

删除指定key,可以一次删除一个或者多个。
语法:

DEL key [key ...]

时间复杂度:o(1)
返回值:删除掉的key的个数。
在这里插入图片描述

5.expire

给指定的key设置过期时间。例如:手机验证码,在某个时间内有效。
语法:

EXPIRE key seconds
或
PEXPIRE key 毫秒

时间复杂度:o(1)
返回值:1表示设置成功,0表示设置失败。
在这里插入图片描述

6.ttl

ttl(time to live)查询过期时间。
语法:

TTL key

时间复杂度:o(1)
返回值:剩余过期时间,-1表示没有关联过期时间,-2表示key不存在。
在这里插入图片描述

7.type

返回key对应的数据类型。
语法:

TYPE key

在这里插入图片描述

三、常用数据类型和编码方式

当前版本的redis支持10个数据类型:String、Lists、Sets、Hashes、Sorted sets、Streams、Geospatial、HyperLogLog、Bitmaps、Bitfields,本次主要讲述前五个。

数据类型内部编码
stringraw
int
embstr
hashhashtable
ziplist
listlinkedlist
ziplist
sethashtable
inset
zsetskiplist
ziplist

1.string

FLUSHALL可以把redis上所有键值对清除掉。

(1)set和get

SET key value [expiration EX seconds | PX millseconds] [NX|XX]

NX:如果key不存在,才设置;
XX:如果key存在,则不设置(返回nil)

get只支持字符串类型的value。
在这里插入图片描述

(2)mset和mget

一次操作多个键值对。

MGET key [key ...]

MSET key value [key value ...]

时间复杂度是o(n),n是当前命令中,给出的key数量。
在这里插入图片描述

(3)setnx,setex,psetex

setnx:不存在才能设置,存在则设置失败;
setex:设置key的过期时间,但是是秒;
psetex:设置key的过期时间,单位是毫秒。
在这里插入图片描述

(4)incr和incrby

a.incr:表示针对value+1

INCR key

此时key对应的value必须是整数。
此操作的返回值,就是+1之和的值。
如果key不存在,则将其value=0来+1。

b.incrby:表示针对value+n
加上正数或者负数。

(5)decr,decrby和incrbyfloat

a.decr:表示针对value-1
只针对整数进行-1。

b.decrby:表示针对value-n
不存在key时,当作0进行处理。

c.incrbyfloat:表示针对value+/-小数
没有decrbyfloat。
(4)和(5)操作的时间复杂度都是o(1)。
在这里插入图片描述

(6)append

如果key已经存在并且是一个string,命令会将value追加到原有string的后边;如果key不存在,则效果等同于set命令。
语法:

APPEND KEY VALUE

时间复杂度:O(1)
返回值:追加完成之后string的长度。
在这里插入图片描述

(7)getrange

返回key对应的string的子串,由start和end确定(左闭右闭)。可以使用负数表示倒数,-1表示倒数第一个字符,-2表示倒数第二个字符。

GETRANGE key strat end

时间复杂度:O(N)
返回值:string类型的子串。
在这里插入图片描述

(8)setrange

覆盖字符串的一部分,从指定的偏移开始。

SETRANGE key offset value

时间复杂度:O(1)
返回值:替换后的string的长度。
在这里插入图片描述
当不存在key时,添加的value会将offset之前的内容填充成0x00。
在这里插入图片描述

(9)strlen

strlen获取到字符串的长度,单位时字节。
在这里插入图片描述

(10)编码方式

有三种内部编码方式:raw(最基本的字符串)、int(64位/8字节的整数,常用来“计数“功能)、embstr(针对短字符串进行的特殊优化)。

(11)应用场景

典型的几个应用场景:
a.缓存(Cache)功能。(Redis+MySQL组成的缓存存储结构)
b.计数(Counter)功能。(记录视频播放次数)
c.共享会话(Session)。(Session分散存储、Redis集中管理Session、短信验证码)

2.hash

(1)hset,hget,hexists,hdel

HSET:设置hash中指定的字段(filed)的值(value)。
语法:

HSET key field value [field value ...]

时间复杂度:O(1)
返回值:添加的字段的个数。
在这里插入图片描述

HGET:获取hash中指字段的值。
语法:

HGET key field

时间复杂度:O(1)
返回值:字段对应的值或者nil。
在这里插入图片描述HEXISTS:查看hash中的字段是否存在。

HEXISTS key field

时间复杂度:O(1)
返回值:1表示存在 ,0表示不存在。
在这里插入图片描述
HDEL:删除hash中指定的字段。
语法:

HDEL key field [field ...]

时间复杂度:O(1)
返回值:本次操作删除的字段个数。
在这里插入图片描述

(2)hkeys和hvals

HKEYS:先根据key找到对应的hash,然后再遍历hash。

HKEYS key

时间复杂度:O(N),N为field的个数。
返回值:字段列表。

HVALS:获取hash中的所有的值。

HVALS key

时间复杂度:O(N),N为field的个数。
返回值:所有的值。
在这里插入图片描述

(3)hgetall和hmget

HGETALL:获取hash中所有的字段以及值。

HGETALL key

时间复杂度:O(N),N是field对应的个数。
返回值:字段和对应的值。

HMGET:一次获取hash中多个字段的值。

HMGET key field [field ...]

时间复杂度:O(N),N为查询个数,只查一个则是O(1)
返回值:字段对应的值或者nil
在这里插入图片描述

(4)hlen,hsetnx,hincrby,hincrbyfloat

HLEN:获取hash中的所有字段的个数。

HLEN key

时间复杂度:O(1)
返回值:字段个数。

HSETNX:在字段不存在的情况下,设置hash中的字段和值。

HSETNX key field value

时间复杂度:O(1)
返回值:0表示设置失败,1表示设置成功。

HINCRBY:将hash中字段对应的数值添加指定的值。

HINCRBY key field increment

时间复杂度:O(1)
返回值:该字段变化之和的值。

HINCRBYFLOAT:HINCRBY小数版本。

HINCRBYFLOAT key field increment

时间复杂度:O(1)
返回值:该字段变化之和的值。
在这里插入图片描述

(5)哈希编码方式

内部编码:hashtable(最基本的哈希表,redis内部的哈希表的实现)、ziplist(压缩列表,针对一些特殊场景对数据压缩,节省空间)。
a.哈希中的元素个数比较少,使用ziplist表示,元素个数比较多,使用hashtable来表示;
b.每个value的值长度都比较短,使用ziplist表示,如果某个value的长度太长了,也会转换成hashtable。

(6)哈希的应用

a.关系型数据表保存用户信息。
b.映射关系表示用户信息。
c.关系型数据库稀疏性。

3.list

(1)lpush和lrange

IPUSH:将一个或者多个元素从左侧放入(头插)到list中。

LPUSH key element [element ...]

时间复杂度:O(1)
返回值:插入后list的长度。

LRANGE:获取从start到end区间的所有元素,左闭右闭。

LRANGE key start stop

时间复杂度:O(N)
返回值:指定区间的元素。
在这里插入图片描述

(2)lpushx,rpush,rpushx

LPUSHX:在key存在时,将一个或者多个元素从左侧放入(头插)到list中。不存在,则直接返回。

LPUSH key element [element ...]

时间复杂度:O(1)
返回值:插入后list的长度。

RPUSH:将一个或者多个元素从右侧放入(尾插)到list中。

RPUSH key element [element ...]

时间复杂度:O(1)
返回值:插入后list的长度。

RPUSHX:在key存在时,将一个或者多个元素从右侧放入(尾插)到list中。

RPUSHX key element [element ...]

时间复杂度:O(1)
返回值:插入后list的长度。
在这里插入图片描述

(3)lpop,rpop

LPOP:从左侧取出元素(即头删)

LPOP key

时间复杂度:O(1)
返回值:取出的元素或者nil。

RPOP:从list右侧取出元素(即尾删)

RPOP key [count]

时间复杂度:O(1)
返回值:取出的元素或者nil。
在这里插入图片描述

(4)lindex,linsert,llen

LINDEX:获取从左数第index位置的元素。

LINDEX key index

时间复杂度:O(N),N是指list中元素的个数。
返回值:取出的元素或者nil。

LINSERT:在特定位置插入元素。

LINSERT key <BEFORE | AFTER> pivot element

时间复杂度:O(N)
返回值:插入后的list长度。

LLEN:获取list长度。

LLEN key

时间复杂度:O(1)
返回值:list的长度。
在这里插入图片描述

(5)lrem

LREM:删除count个list的元素。

LREM key count element

时间复杂度:O(N+M)
返回值:删除元素的个数。
在这里插入图片描述

(6)ltrim,lset

LTRIM:保留start和stop之间区间内的元素。(区间外面两边的元素就直接被删除了)

LTRIM key start stop

时间复杂度:O(N)
返回值:

LSET:根据下标,修改元素。

LSET key index element

时间复杂度:O(N)
在这里插入图片描述
注:lindex可以很好处理下标越界的情况,直接返回nil;lset来说则会报错。

(7)blpop和brpop

blpop和brpop是lpop和rpop的阻塞版本,和对应非阻塞版本的作用基本一致。除了:
a.在列表中有元素的情况下,阻塞和非阻塞表现是一致的。但如果列表中没有元素,非阻塞版本会理解返回nil,但阻塞版本会根据timeout,阻塞一段时间,期间Redis可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态。
b.命令中如果设置了多个键,那么会从左向右进行遍历键,一旦有一个键对应的列表可以弹出元素,命令立即返回。
c.如果多个客户端同时多一个键执行pop,则最先执行命令的客户端会得到弹出的元素。

BLPOP:

BLPOP key [key ...] timeout

BRPOP:

BRPOP key [key ...] timeout

(8)编码方式

内部编码:linkedlist(链表)、ziplist(压缩列表)。
quicklist相当于是链表和压缩列表的结合,整体还是一个链表,链表的每个节点,是一个压缩列表。

(9)应用场景

a.用list作为数组这样的结构,来存储多个元素。
b.消息队列。(生产者消费者模型)
c.分频道的消息队列。
d.微博Timeline。

4.set

不能重复的无序集合。

(1)sadd,smembers,sismember

SADD:将一个或者多个元素添加到set中。注意,重复的元素无法添加到set中。

SADD key member [member ...]

时间复杂度:O(1)
返回值:本次添加成功的元素个数。
SMEMBERS:获取一个set中的所有元素,注意,元素间的顺序是无序的。

SMEMBERS key

时间复杂度:O(N)
返回值:所有元素的列表。

SISMEMBER:判断一个元素在不在set中。

SISMEMBER key member

时间复杂度:O(1)
返回值:1表示元素在set中,0表示元素不在set中或者key不存在。
在这里插入图片描述

(2)spop和ssrandmember

SPOP:从set中删除并返回一个或者多个元素。注意:由于set内的元素是无序的,所以取出哪个元素是随机的。

SPOP key [count]

时间复杂度:O(1)
返回值:取出的元素。

SSRANDMEMBER:从set中随机弹出一个或者多个元素。

SSRANDMEMBER key [count]

时间复杂度:O(1)
返回值:弹出的元素

在这里插入图片描述

(3)smove和srem

SMOVE:将一个元素从源set取出并放入目标set中。

SMOVE source destination member

时间复杂度 :O(1)
返回值:1表示移动成功,0表示失败。

SREM:将指定的元素从set中删除。

SREM key member [member ...]

时间复杂度:O(1)
返回值:本次操作删除的元素个数。
在这里插入图片描述

(4)sinter,sinterstore

SINTER:获取给定set的交集中的元素。

SINTER key [key ...]

时间复杂度:O(N*M),N是最小的集合元素个数,M是最大的集合元素个数。
返回值:交集的元素。

SINTERSTORE:获取给定set的交集中的元素并保存到目标set中。

SINTERSTORE destination key [key ...]

时间复杂度:O(N*M),N是最小的集合元素个数,M是最大的集合元素个数。
返回值:交集的元素个数。
在这里插入图片描述

(5)sunion,sunionstore,sdiff,sdiffstore

SUNION:获取给定set的并集中的元素。

SUNION key [key ...]

时间复杂度:O(N),N给定的所有集合的总的元素个数。
返回值:并集的个数。

SUNIONSTORE:获取给定set的并集中的元素并保存到目标set中。

SUNIONSTORE destination key [key ...]

时间复杂度:O(N),N给定的所有集合的总的元素个数。
返回值:并集的元素个数。
在这里插入图片描述

SDIFF:获取给定set的差集中的元素。

SDIFF key [key ...]

时间复杂度:O(N),N给定的所有集合的总的元素个数。
返回值:差集的元素。
在这里插入图片描述

SDIFFSTORE:获取给定set的差集中的元素并保存到目标set中。

SDIFFSTORE destination key [key ...]

时间复杂度:O(N),N给定的所有集合的总的元素个数。
返回值:差集的元素个数。
在这里插入图片描述

(6)编码方式

内部编码:hashtable、inset(集合中存的都是整数)。

(7)应用场景

a.使用set来保存用户的“标签”。
b.使用set来计算用户之间的共同好友。(基于“集合求交集”)
c.使用set统计UV。(去重,uv需要按照用户进行去重,去重过程可以使用set来完成)
UV(user view):每个用户访问服务器都会产生一个uv,但是同一个用户多次访问,不会使uv增加。

5.zset

不重复的有序集合。

(1)zadd

ZADD:添加或者更新指定的元素以及关联的分数到zset在,分数应该符合double类型,+inf/-infor作为正负极限也是合法的。

ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]

XX:仅仅用于更新已经存在的元素,不会添加新元素。
NX:仅用于添加新元素,不会更新已经存在的元素。
CH:默认情况下,ZADD返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
INCR:此时命令类似ZINCRBY的效果,将元素的分数加上指定的分数。此时只能指定一个元素和分数。
时间复杂度:O(log(N))
返回值:本次添加成功的元素个数。

(2)zcard,zcount

ZCARD:获取一个zset的基数(cardinality),即zset中的元素个数。

SCARD key

时间复杂度:O(1)
返回值:zset内的元素个数。

ZCOUNT:返回分数在min和max之间的元素个数,默认情况下,min和max都是包含的,可以通过(排除。

ZCOUNT key min max

时间复杂度:O(log(N))
返回值:满足条件的元素列表个数。
在这里插入图片描述

(3)zrange,zrevrange,zrangebyscore

ZRANGE:返回指定区间里的元素,分数按照升序。带上WITHSCORES可以把分数也返回。

ZRANGE key start stop [WITHSCORES]

时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。

ZREVRANGE:返回指定区间里的元素,分数按照降序。带上WITHSCORES可以把分数也返回。

ZREVRANGE key start stop [WITHSCROES]

时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。
在这里插入图片描述

ZRANGEBYSCORE:返回分数在min和max之间的元素,默认情况下,min和max都是包含的,可以通过(排除。

ZRANGEBYSCORE key min max [WITHSCORES]

时间复杂度:O(log(N))+M)
返回值:区间内的元素列表。
在这里插入图片描述

(4)zpopmax

ZPOPMAX:删除并返回分数最高的count个元素。

ZPOPMAX key [count]

时间复杂度:O(log(N))+M)
返回值:分数和元素列表。

在这里插入图片描述

(5)bzpopmax

BZPOPMAX:ZPOPMAX的阻塞版本。

BZPOPMAX key [key ...] timeout

时间复杂度:O(log(N))
返回值:元素列表。

在这里插入图片描述
集合元素为空时,就是阻塞。
在这里插入图片描述

(6)zpopmin,bzpopmin

ZPOPMIN:删除并返回分数最低的count个元素。

ZPOPMIN key 【count]

时间复杂度:O(log(N))*M)
返回值:分数和元素列表。
在这里插入图片描述

BZPOPMIN:ZPOPMIN的阻塞版本。

BZPOPMIN key 【count]

时间复杂度:O(log(N))
返回值:元素列表。

(7)zrank,zrevrank,zscore

ZRANK:返回指定元素的排名,升序。

ZRANK key member

时间复杂度:O(log(N))
返回值:排名。

ZREVRANK:返回指定元素的排名,降序。

ZREVRANK key member

时间复杂度:O(log(N))
返回值:排名。

ZSCORE:返回指定元素的分数。

ZSCORE key member

时间复杂度:O(1)
返回值:分数。
在这里插入图片描述

(8)zrem,zremrangebyrank,zremrangebyscore

ZREM:删除指定的元素。

ZREM key member [member ...]

时间复杂度:O(M * log(N))
返回值:本次操作删除的元素个数。

ZREMRANGEBYRANK:按照排序,升序删除指定范围的元素,左闭右闭。

ZREMRANGEBYRANK key start stop

时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数。

ZREMRANGEBYSCORE:按照分数删除指定范围的元素,左闭右闭。

ZREMRANGEBYSCORE key min max

时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数。
在这里插入图片描述

(9)zincrby

ZINCRBY:为指定的元素的关联分数添加指定的分数值。

ZINCRBY key increment member

时间复杂度:O(log(N))
返回值:增加后元素的分数。
在这里插入图片描述

还可以加上负数小数。

(10)zinterstore

ZINTERSTORE:求出给定有序集合中元素的交集并保存进目标有序集合中,在合并过程中以元素为单位进行合并,元素对应的分数按照不同的聚合方式和权重得到新的分数。

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]

时间复杂度:O(NK)+O(Mlog(M)) N 是输入的有序集合中,最小的有序集合的元素个数;K 是输入了几个有序集合;M 是最终结果的有序集合的元素个数。
返回值:⽬标集合中的元素个。
在这里插入图片描述

(11)zunionstore

ZUNIONSTORE:求出给定有序集合中元素的并集并保存进目标有序集合中,在合并过程中以元素为单位进行合并,元素对应的分数按照不同的聚合方式和权重得到新的分数。

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]

时间复杂度:O(N)+O(M*log(M)) N 是输入的有序集合总的元素个数; M 是最终结果的有序集合的元素个数。
返回值:目标集合中的元素个数。
在这里插入图片描述

(12)编码方式

内部编码:skiplist(跳表,也是链表,但是不同于普通链表,每个节点上有多个指针域)、ziplist。

(13)应用场景

a.添加用户赞数。
b.取消用户赞数。
c.展示获取赞数最多的10个用户。
d.展示用户信息以及用户分数。

6.补充类型

(1)stream

stream是一种数据结构,其作用类似于仅追加日志,但也实现了多个操作来克服典型仅追加日志的一些限制。其中包括O(1)时间的随机访问和复杂的消费策略,如消费者群体。可以使用stream实时记录和同时联合事件。
示例:
a.事件溯源(例如,跟踪用户操作、点击等)
b.传感器监控(例如,现场设备的读数)
c.通知(例如,将每个用户的通知记录存储在单独的流中)
d.Redis为每个流条目生成一个唯一的 ID。 可以在以后使用这些 ID 检索其关联的条目,或读取和处理流中的所有后续条目。
stream支持多种修剪策略(以防止流无限增长)和多个消费策略(请参阅 XREAD、XREADGROUP 和 XRANGE)。

(2)geospatial

Redis geospatial 索引允许存储坐标并搜索它们。 此数据结构可用于查找给定半径或边界框内的邻近点。
基本命令:
GEOADD 将位置添加到给定的geospatial索引(请注意,使用此命令,经度位于纬度之前)。
GEOSEARCH 返回具有给定半径或边界框的位置。

(3)hyperloglog

HyperLogLog 是一种概率数据结构,用于估计集合的基数。
应用场景只有一个,估算集合中的元素个数。

(4)bitmap

使用bit位来表示整数。
Redis bitmap不是实际的数据类型,而是一组面向位的操作在被视为位向量的字符串类型上定义。由于字符串是二进制安全 blob,其最大长度为 512 MB,它们适用于设置多达2^32个不同的位。

可以对一个或多个字符串执行按位运算。bitmap用例的一些示例包括:
集合成员对应于整数 0-N 的情况的有效集合表示形式。
对象权限,其中每个位表示一个特定权限,类似于文件系统存储权限的方式。

基本命令:
SETBIT 将提供的偏移量处的位设置为 0 或 1。
GETBIT 返回给定偏移量的位值。
BITOP 允许您对一个或多个字符串执行按位运算。

(5)bitfield

Redis bitfields 允许设置、递增和获取任意位长度的整数值。 例如,您可以对从无符号 1 位整数到有符号 63 位整数的任何内容进行操作。

这些值使用二进制编码的 Redis 字符串进行存储。bitfields 支持原子读取、写入和递增操作,使其成为管理计数器和类似数值的不错选择。

基本命令:
BITFIELD:以原子方式设置、递增和读取一个或多个值。
BITFIELD_RO 是 BITFIELD 的只读变体。

7.渐进式遍历

scan

SCAN:以渐进式的方式进行键的遍历。

SCAN cursor [MATH pattern] [COUNT count] [TYPE type]

时间复杂度:O(1)
返回值:下一次scan的游标(cursor)以及本次得到的键。
select :切换到第几个数据库。
dbsize:数据库中key的个数。
flushdb:清空数据库。
flushall:清空当前数据库所有key。

面试题:redis虽然是单线程模型,为什么效率这么高?速度这么快?

1、redis访问内存,数据库则是访问硬盘。
2、redis的核心功能,比数据库的核心功能更简单。
3、单线程模型,避免了一些不必要的现场竞争开销。
4、处理网络IO的时候,使用了epoll这样的IO多路复用模型。

四、redis客户端

1.RESP

redis所提供的协议。
优点:
(1)简单好实现。
(2)快速进行解析。
(3)肉眼可读。
传输层基于TCP,但是和TCP没有强耦合。
请求和响应之间的通信模型是一问一答的形式。

2.Java客户端

(1)引入jedis依赖

在这里插入图片描述

(2)连接redis服务器

SSH进行端口映射。
在这里插入图片描述
映射端口配置,连接。
在这里插入图片描述

测试是否连接成功。
在这里插入图片描述
在这里插入图片描述


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

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

相关文章

【C++】STL简介 | string类的常用接口

目录 STL简介 学string类前的铺垫 概念 为什么要学string类 string类的底层&#xff08;了解&#xff09; 编码表的故事 string类的常用接口与应用 3个必掌握的构造 赋值 访问字符operator[] 初识迭代器&#xff08;iterator&#xff09; 反向迭代器 用范围for遍历…

uniapp获取一周日期和星期

UniApp可以使用JavaScript中的Date对象来获取当前日期和星期几。以下是一个示例代码&#xff0c;可以获取当前日期和星期几&#xff0c;并输出在一周内的每天早上和晚上&#xff1a; // 获取当前日期和星期 let date new Date(); let weekdays ["Sunday", "M…

剔除数据中的异常值(python实现)

目录 一、3σ原则 二、箱线图发现异常值 三、boxcox数据变换 一、3σ原则 该准则仅局限于对正态或近似正态分布的样本数据处理,此外,当测量次数少的情形用准则剔除粗大误差是不够可靠的。 异常值是指样本中的个别值,其数值明显偏离其余的观测值。异常值也称离群点,异常…

xpath定位不包含某种属性的元素

今天定位一个页面中的input文本框&#xff0c;发现竟然有两个几乎一模一样的html代码的input文本框。 唯一不同的是&#xff0c;一图中的input有一个comps"[object Object],[object Object]"的属性和属性值&#xff0c;二图则没有。我要定位的是二图中的input&#x…

AUTOSAR实战篇:手把手带你搞定Watchdog协议栈

AUTOSAR实战篇:手把手带你搞定Watchdog协议栈 前言 小T出品,必是精品! 手把手搞定Watchdog协议栈,你值得拥有! 正文 在进行Watchdog协议栈实战之前,建议先阅读小T之前有关Watchdog协议栈的两篇文章《Watchdog协议栈上》与《Watchdog协议栈下》先了解下在AUTOSAR框架下的W…

【Redis】第7讲 常用的操作命令

连接redis并测试 redis-cliping 设置并获取数据 set k1 chinaget k1 测试性能 rootsue-virtual-machine:~# redis-benchmark ctrlc 退出redis,执行命令5秒就ctrlc关闭&#xff0c;性能要看电脑的配置高低 默认16个数据库 vim /opt/redis-5.0.4/redis.conf 数据库键的数量 …

深入理解web安全攻防策略,看完这一篇就够了

前言 互联网时代&#xff0c;数据安全与个人隐私信息等受到极大的威胁和挑战&#xff0c;本文将以几种常见的攻击以及防御方法展开分析。 1. XSS (跨站脚本攻击) 定义&#xff1a;通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击…

王道考研数据结构代码总结(第八章)

目录 排序插入排序直接插入排序折半插入希尔排序链表的插入排序插入类排序总结 交换排序冒泡排序快速排序 选择排序简单选择排序堆排序堆的插入堆的删除 归并排序基数排序 本文包含王道考研讲课中所涉及的数据结构中的所有代码&#xff0c;当PPT代码和书上代码有所区别时以咸鱼…

“智慧”北京,人工智能引领“新风尚”

原创 | 文 BFT机器人 北京时间&#xff0c;9月15日&#xff0c;北京人工智能产业峰会暨中关村科学城科创大赛颁奖典礼在北京中关村举行&#xff0c;同时惠阳还举行了“中关村人工智能大模型产业集聚区”启动建设的揭牌仪式。 此次大会围绕北京AI产业的建设与发展&#xff0c;各…

一篇文章彻底弄懂单调栈!!!

前言 最近梳理完中间件后荔枝一边学项目一边刷算法&#xff0c;一刷了代码随想录中的字符串、双指针、栈和队列以及单调栈。其中感觉比较有难度的还是单调栈嘿&#xff0c;因此有必要(水)梳理一篇文章来复盘一下单调栈的相关知识~ 希望复盘完后可以有所收获&#xff01; 文章目…

某音网页端 X-Bogus 参数

逆向目标 目标&#xff1a;某音网页端用户信息接口 X-Bogus 参数 接口&#xff1a;aHR0cHM6Ly93d3cuZG91eWluLmNvbS9hd2VtZS92MS93ZWIvdXNlci9wcm9maWxlL290aGVyLw 什么是 JSVMP&#xff1f; JSVMP 全称 Virtual Machine based code Protection for JavaScript&#xff0c;即 …

根据条件关闭软件

使用下载工具时&#xff0c;经常出现磁盘空间已满&#xff0c;无法下载的情况。 使用shell写一个监控&#xff0c;每2分钟执行一次。判断当前磁盘的空间&#xff0c;低于2G时&#xff0c;关闭下载软件。 获取空间大小 ➜ ~ df -h …

如何运用API接口获取淘宝1688京东商品数据:从入门到实践

一、引言 随着电子商务的飞速发展&#xff0c;许多电商平台提供了API接口&#xff0c;允许开发者获取商品数据&#xff0c;以创建各种创新的应用。本文将详细介绍如何使用API接口获取商品数据&#xff0c;并通过代码示例进行演示。 二、API接口概述 1.API接口定义 API&…

【校招VIP】数据库理论之数据库范式

考点介绍&#xff1a; 范式是指关系数据库中的一种数据结构设计规范&#xff0c;用于规范关系型数据库中数据的存储方式&#xff0c;目的是为了消除冗余数据&#xff0c;减少数据的重复性&#xff0c;提高数据的一致性、完整性和正确性&#xff0c;避免数据的不一致性和冲突 …

三相组合式过电压保护器试验

三相组合式过电压保护器试验 试验目的 三相组合式过电压保护器主要分为有带串联间隙过压保护器和无间隙过压保护器两大类&#xff0c;其试验项目内容要求分别使用高压工频交流和高压直流电源。 三相组合式过电压保护器试验&#xff0c;主要是为了及早发现设备内部绝缘受潮及…

华为云云耀云服务器L实例评测|云耀云服务器L实例部署Dashdot服务器仪表盘

华为云云耀云服务器L实例评测&#xff5c;云耀云服务器L实例部署Dashdot服务器仪表盘 一、云耀云服务器L实例介绍二、Dashdot介绍2.1 Dashdot简介2.2 开发环境要求2.3 Yarn介绍 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、检查服务器环境4.1 购买云耀云服务器L实例…

Android中的缓存策略:LruCache和DiskLruCache

Android中的缓存策略&#xff1a;LruCache和DiskLruCache 导言 本篇文章主要是介绍Android中内置的两个缓存类的原理。所谓缓存&#xff0c;就是将获取的数据保存下来以便下次继续使用&#xff0c;这种技术尤其在网络请求和图片加载中有用&#xff0c;可以显著地提升App的性能…

SSM - Springboot - MyBatis-Plus 全栈体系(十三)

第三章 MyBatis 一、MyBatis 简介 1. 简介 MyBatis 最初是 Apache 的一个开源项目 iBatis, 2010 年 6 月这个项目由 Apache Software Foundation 迁移到了 Google Code。随着开发团队转投 Google Code 旗下&#xff0c; iBatis3.x 正式更名为 MyBatis。代码于 2013 年 11 月迁…

大模型训练显存优化推理加速方案

当前的深度学习框架大都采用的都是fp32来进行权重参数的存储&#xff0c;比如Python float的类型为双精度浮点数fp64&#xff0c;pytorch Tensor的默认类型为单精度浮点数fp32。随着模型越来越大&#xff0c;加速训练模型的需求就产生了。在深度学习模型中使用fp32主要存在几个…

R语言贝叶斯MCMC:GLM逻辑回归、Rstan线性回归、Metropolis Hastings与Gibbs采样算法实例...

原文链接&#xff1a;http://tecdat.cn/?p23236 在频率学派中&#xff0c;观察样本是随机的&#xff0c;而参数是固定的、未知的数量&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频 什么是频率学派&#xff1f; 概率被解释为一个随机过程的许多观测…