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


    文章目录


    前言

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


    一、Redis安装

    ubuntu和centOS下安装redis。

    1.Ubuntu下安装

    (1)切换到root用户下

    sudo -i
    
    • 1

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

    su root 
    
    • 1

    (2)使用apt安装redis5

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

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

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

    (4)验证安装是否成功

    a.启动redis服务

    service redis-server start
    
    • 1

    b.关闭redis服务

    service redis-server stop
    
    • 1

    c.重启redis服务

    service redis-server restart
    
    • 1

    2.Centos7下安装

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

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

    yum install centos-release-scl-rh
    yum install rh-redis5-redis
    
    • 1
    • 2

    (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
    
    • 1
    • 2
    • 3
    • 4

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

    cd /etc/
    ln -s /etc/opt/rh/rh-redis5/ ./redis
    
    • 1
    • 2

    (3)修改配置文件

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

    (4)设置工作目录

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

    (5)设置日志目录

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

    (6)启动redis

    redis-server /etc/redis/redis.conf
    
    • 1

    (7)停止redis

    a.查看redis-server的pid

    ps aux | grep redis
    
    • 1

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

    kill 进程id
    或者
    kill -9 进程id
    
    • 1
    • 2
    • 3

    3.Centos8下安装Redis

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

    (1)使用yum安装

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

    yum install -y redis
    
    • 1

    (2)通过systemd管理Redis

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

    systemctl enable redis
    
    • 1

    (3)支持远程连接

    和之前的一样。
    修改ip

     bind 0.0.0.0
    
    • 1

    关闭保护模式

    protected-mode no # 把 yes 改成 no
    
    • 1

    (4)通过systemd控制redis

    a.启动redis服务

    systemctl start redis
    
    • 1

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

    netstat -nlpt | grep 6379
    
    • 1

    b.停止redis服务

    systemctl stop redis
    
    • 1

    c.重启redis服务

    systemctl restart redis
    
    • 1

    二、Redis基础命令

    1.get和set

    在这里插入图片描述

    2.keys

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

    KEYS pattern
    
    • 1

    支持如下样式:
    (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 ...]
    
    • 1

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

    4.del

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

    DEL key [key ...]
    
    • 1

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

    5.expire

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

    EXPIRE key seconds
    或
    PEXPIRE key 毫秒
    
    • 1
    • 2
    • 3

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

    6.ttl

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

    TTL key
    
    • 1

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

    7.type

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

    TYPE key
    
    • 1

    在这里插入图片描述

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

    当前版本的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]
    
    • 1

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

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

    (2)mset和mget

    一次操作多个键值对。

    MGET key [key ...]
    
    MSET key value [key value ...]
    
    • 1
    • 2
    • 3

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

    (3)setnx,setex,psetex

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

    (4)incr和incrby

    a.incr:表示针对value+1

    INCR key
    
    • 1

    此时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
    
    • 1

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

    (7)getrange

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

    GETRANGE key strat end
    
    • 1

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

    (8)setrange

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

    SETRANGE key offset value
    
    • 1

    时间复杂度: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 ...]
    
    • 1

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

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

    HGET key field
    
    • 1

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

    HEXISTS key field
    
    • 1

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

    HDEL key field [field ...]
    
    • 1

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

    (2)hkeys和hvals

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

    HKEYS key
    
    • 1

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

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

    HVALS key
    
    • 1

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

    (3)hgetall和hmget

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

    HGETALL key
    
    • 1

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

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

    HMGET key field [field ...]
    
    • 1

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

    (4)hlen,hsetnx,hincrby,hincrbyfloat

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

    HLEN key
    
    • 1

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

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

    HSETNX key field value
    
    • 1

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

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

    HINCRBY key field increment
    
    • 1

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

    HINCRBYFLOAT:HINCRBY小数版本。

    HINCRBYFLOAT key field increment
    
    • 1

    时间复杂度: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 ...]
    
    • 1

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

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

    LRANGE key start stop
    
    • 1

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

    (2)lpushx,rpush,rpushx

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

    LPUSH key element [element ...]
    
    • 1

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

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

    RPUSH key element [element ...]
    
    • 1

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

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

    RPUSHX key element [element ...]
    
    • 1

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

    (3)lpop,rpop

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

    LPOP key
    
    • 1

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

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

    RPOP key [count]
    
    • 1

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

    (4)lindex,linsert,llen

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

    LINDEX key index
    
    • 1

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

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

    LINSERT key  pivot element
    
    • 1

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

    LLEN:获取list长度。

    LLEN key
    
    • 1

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

    (5)lrem

    LREM:删除count个list的元素。

    LREM key count element
    
    • 1

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

    (6)ltrim,lset

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

    LTRIM key start stop
    
    • 1

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

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

    LSET key index element
    
    • 1

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

    (7)blpop和brpop

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

    BLPOP:

    BLPOP key [key ...] timeout
    
    • 1

    BRPOP:

    BRPOP key [key ...] timeout
    
    • 1

    (8)编码方式

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

    (9)应用场景

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

    4.set

    不能重复的无序集合。

    (1)sadd,smembers,sismember

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

    SADD key member [member ...]
    
    • 1

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

    SMEMBERS key
    
    • 1

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

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

    SISMEMBER key member
    
    • 1

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

    (2)spop和ssrandmember

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

    SPOP key [count]
    
    • 1

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

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

    SSRANDMEMBER key [count]
    
    • 1

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

    在这里插入图片描述

    (3)smove和srem

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

    SMOVE source destination member
    
    • 1

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

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

    SREM key member [member ...]
    
    • 1

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

    (4)sinter,sinterstore

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

    SINTER key [key ...]
    
    • 1

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

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

    SINTERSTORE destination key [key ...]
    
    • 1

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

    (5)sunion,sunionstore,sdiff,sdiffstore

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

    SUNION key [key ...]
    
    • 1

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

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

    SUNIONSTORE destination key [key ...]
    
    • 1

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

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

    SDIFF key [key ...]
    
    • 1

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

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

    SDIFFSTORE destination key [key ...]
    
    • 1

    时间复杂度: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 ...]
    
    • 1

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

    (2)zcard,zcount

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

    SCARD key
    
    • 1

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

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

    ZCOUNT key min max
    
    • 1

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

    (3)zrange,zrevrange,zrangebyscore

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

    ZRANGE key start stop [WITHSCORES]
    
    • 1

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

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

    ZREVRANGE key start stop [WITHSCROES]
    
    • 1

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

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

    ZRANGEBYSCORE key min max [WITHSCORES]
    
    • 1

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

    (4)zpopmax

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

    ZPOPMAX key [count]
    
    • 1

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

    在这里插入图片描述

    (5)bzpopmax

    BZPOPMAX:ZPOPMAX的阻塞版本。

    BZPOPMAX key [key ...] timeout
    
    • 1

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

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

    (6)zpopmin,bzpopmin

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

    ZPOPMIN key 【count]
    
    • 1

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

    BZPOPMIN:ZPOPMIN的阻塞版本。

    BZPOPMIN key 【count]
    
    • 1

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

    (7)zrank,zrevrank,zscore

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

    ZRANK key member
    
    • 1

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

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

    ZREVRANK key member
    
    • 1

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

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

    ZSCORE key member
    
    • 1

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

    (8)zrem,zremrangebyrank,zremrangebyscore

    ZREM:删除指定的元素。

    ZREM key member [member ...]
    
    • 1

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

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

    ZREMRANGEBYRANK key start stop
    
    • 1

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

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

    ZREMRANGEBYSCORE key min max
    
    • 1

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

    (9)zincrby

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

    ZINCRBY key increment member
    
    • 1

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

    还可以加上负数小数。

    (10)zinterstore

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

    ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE ]
    
    • 1

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

    (11)zunionstore

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

    ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE ]
    
    • 1

    时间复杂度: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]
    
    • 1

    时间复杂度: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进行端口映射。
    在这里插入图片描述
    映射端口配置,连接。
    在这里插入图片描述

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


  • 相关阅读:
    2022春夏系列 KOREANO ESSENTIAL重塑时装生命力
    企业特权账号安全管理建设思路
    建模杂谈系列153 程序的集成与自动化
    青藏高原1-km分辨率生态环境质量变化数据集(2000-2020)
    LeetCode[105]从前序与中序遍历序列构造二叉树
    手动实现BERT
    联邦学习:联邦多视角学习在跨领域推荐中的应用
    成为一个优秀的 Python 数据分析师需要哪些知识?
    垂直分表为什么能够加快查询效率?
    VD6283TX环境光传感器驱动开发(3)----测试闪烁频率代码
  • 原文地址:https://blog.csdn.net/qq_45283185/article/details/129755983