Redis解读(1):Redis安装启动及常见数据类型

时间:2023-03-08 23:44:46
Redis解读(1):Redis安装启动及常见数据类型

Redis 简介

Redis 是我们在互联网应用中使用最广泛的一个 NoSQL 数据库,基于 C 开发的键值对存储数据库。

Redis 这个名字是 Remote Dictionary Service 字母缩写。

很多人想到 Redis,就想到缓存。但实际上 Redis 除了缓存之外,还有许多更加丰富的使用场景。比如分布式锁,限流。

Redis 特点

  • 支持数据持久化
  • 支持多种不同的数据结构类型之间的映射
  • 支持主从模式的数据备份
  • 自带了发布订阅系统
  • 定时器、计数器

redis的安装

四种方式获取一个 Redis:

  1. 直接编译安装(推荐使用)

    提前准备好 gcc 环境

    yum install gcc-c++

    接下来下载并安装 Redis:

    wget https://download.redis.io/releases/redis-6.2.1.tar.gz
    tar -zxvf redis-6.2.1.tar.gz
    cd redis-6.2.1/
    make
    make install

    安装完成后,启动 Redis:

    redis-server redis.conf

    启动成功页面如下:

    Redis解读(1):Redis安装启动及常见数据类型

  2. 使用Docker

    Docker 安装好之后,启动 Docker ,直接运行安装命令即可,启动后返回容器运行的ID

    docker run --name taoguoguo-redis -d -p 6379:6379 redis --requirepass 123
    • 我们先查看运行在Docker上的redis容器

      docker ps

      Redis解读(1):Redis安装启动及常见数据类型

    • 确保容器正在运行后,可以从宿主机上连接(前提是宿主机上存在 redis-cli),因为第一种编译安装方式我们已经在宿主机上安装了redis 所以可以直接使用宿主机的命令行工具

      #redis-cli 客户端命令 默认参数有地址 -h 127.0.0.1 端口 -p 6379 密码 -a '123'
      redis-cli -a 123

      Redis解读(1):Redis安装启动及常见数据类型

      宿主机客户端,连接成功!

    • 如果宿主机上没有安装 Redis,那么也可以进入到 Docker 容器种去操作 Redis:

      #1.退出当前redis
      exit
      #2.进入Redis容器
      docker exec -it taoguoguo-redis redis-cli -a 123

      Redis解读(1):Redis安装启动及常见数据类型

  3. 也可以直接安装

    • CentOS

      yum install redis
    • Ubuntu

      apt-get install redis
    • Mac

      brew install redis
  4. 通过在线体验,使用Redis的相关功能 http://try.redis.io/

redis的后台启动

  • 首先,修改 redis.conf 配置文件,将daemonize 守护线程启动方式开启

    Redis解读(1):Redis安装启动及常见数据类型

    配置完成后,保存退出,启动 redis

    redis-server redis.conf

redis的数据类型

String

String 是 Redis 里边最最简单的一种数据结构。在 Redis 中,所以的 key 都是字符串(序列化后的字符串),但是,不同的 key 对应的 value 则具备不同的数据结构,我们所说的五种不同的数据类型,主要是指 value 的数据类型不同。

Redis 中的字符串是动态字符串,内部是可以修改的,像 Java 中的 StringBuffer,它采用分配冗余空间的方式来减少内存的频繁分配。在 Redis 内部结构中,一般实际分配的内存会大于需要的内存,当字符串小于 1M 的时候,扩容都是在现有的空间基础上加倍,扩容每次扩 1M 空间,最大 512M。

set

set 就是给一个 key 赋值的。

Redis解读(1):Redis安装启动及常见数据类型

append

使用 append 命令时,如果 key 已经存在,则直接在对应的 value 后追加值,否则就创建新的键值对。

Redis解读(1):Redis安装启动及常见数据类型

decr

可以实现对 value 的减 1 操作(前提是 value 是一个数字),如果 value 不是数字,会报错,如果value 不存在,则会给一个默认的值为 0,在默认值的基础上减一。

Redis解读(1):Redis安装启动及常见数据类型

decrby

和 decr 类似,但是可以自己设置步长,该命令第二个参数就是步长。

比如把K3 的值 减10 设置每次递减的步长为10即可

Redis解读(1):Redis安装启动及常见数据类型

get

get 用来获取一个 key 的 value。

Redis解读(1):Redis安装启动及常见数据类型

getrange

getrange 可以用来返回 key 对应的 value 的子串,这有点类似于 Java 里边的 substring。这个命令第二个和第三个参数就是截取的起始和终止位置,其中,0表示起始字符串,-1 表示最后一个字符串,-2 表示倒数第二个字符串,以此类推...

Redis解读(1):Redis安装启动及常见数据类型

注意:原来存在在redis中 key对应的value 不会发生改变

getset

获取并更新某一个 key。

Redis解读(1):Redis安装启动及常见数据类型

incr

给某一个 key 的 value 自增

Redis解读(1):Redis安装启动及常见数据类型

incrby

给某一个 key 的 value 自增,同时还可以设置步长

Redis解读(1):Redis安装启动及常见数据类型

incrbyfloat

和 incrby 类似,但是自增的步长可以设置为浮点数。 incrby 是不可以增加浮点数的

Redis解读(1):Redis安装启动及常见数据类型

mget 和 mset

批量获取和批量存储

Redis解读(1):Redis安装启动及常见数据类型

ttl

查看 key 的有效期, -1 代表永远不会过期 , -2 代表已经过期

Redis解读(1):Redis安装启动及常见数据类型

setex

在给 key 设置 value 的同时,还设置过期时间,时间到了

Redis解读(1):Redis安装启动及常见数据类型

psetex

和 setex 类似,只不过这里的时间单位是毫秒(1000ms = 1s)。

Redis解读(1):Redis安装启动及常见数据类型

setnx

默认情况下, set 命令会覆盖已经存在的 key,setnx 则不会。

Redis解读(1):Redis安装启动及常见数据类型

msetnx

批量设置,如果有一个存在,整个操作会失败。

Redis解读(1):Redis安装启动及常见数据类型

setrange

指定offset(偏移量) 覆盖一个已经存在的 key 的value

Redis解读(1):Redis安装启动及常见数据类型

strlen

查看字符串长度

Redis解读(1):Redis安装启动及常见数据类型

String(BIT) 相关命令

在 Redis 中,字符串都是以二进制的方式来存储的。例如 set k1 a,a 对应的 ASCII 码是 97,97 转为二进制是 01100001,BIT 相关的命令就是对二进制进行操作的。

getbit

key 对应的 value 在 offset 处的 bit 值

Redis解读(1):Redis安装启动及常见数据类型

setbit

修改 key 对应的 value 在 offset 处的 bit 值

Redis解读(1):Redis安装启动及常见数据类型

bitcount

统计二进制数据中 1 的个数, 采用位

Redis解读(1):Redis安装启动及常见数据类型

bitCount应用场景举例,假设我要记录测算系统每个用户当前登录的次数,比如用户名为: taoguoguo

#命令如下
setbit key 当前登录次数 偏移量
#第一次登录
setbit taoguoguo 1 1
#第二次登录
setbit taoguoguo 2 1
#第三次登录
setbit taoguoguo 3 1
#当前登录次数统计
bitcount taoguoguo

Redis解读(1):Redis安装启动及常见数据类型

List

Redis中的List实际上是一个string类型的双向链表,因此既可以做栈也可以做队列来使用。不同的是栈是先进后出,队列是先进先出。链表被广泛地用于实现Redis的各种功能,如列表键、发布与订阅、慢查询、监视器等。Redis中单个List可容纳2^32-1约40亿个元素

链表的特点:

  • 链表中的元素是有序的,可通过索引下标来获取某个元素或某个范围内的元素列表。
  • 链表中的元素是可以重复的

lpush

将所有指定的值插入到存于 key 的列表的头部。如果 key 不存在,那么在进行 push 操作前会创建一个空列表。 如果 key 对应的值不是一个 list 的话,那么会返回一个错误。

Redis解读(1):Redis安装启动及常见数据类型

rpush

向存于 key 的列表的尾部插入所有指定的值。

Redis解读(1):Redis安装启动及常见数据类型

lrange

返回列表指定区间内的元素,索引从0开始,-1为最后一个。

Redis解读(1):Redis安装启动及常见数据类型

lpop

移除并返回列表的头元素。

Redis解读(1):Redis安装启动及常见数据类型

rpop

移除并返回列表的尾元素。

Redis解读(1):Redis安装启动及常见数据类型

lindex

返回列表中,下标为 index 的元素。

Redis解读(1):Redis安装启动及常见数据类型

ltrim

ltrim 可以对一个列表进行修剪,类似于subList。

Redis解读(1):Redis安装启动及常见数据类型

blpop/brpop

阻塞式的弹出,相当于 lpop 的阻塞版,如果当前List数据为空,那么在阻塞时长内如果有添加元素 会进行弹出,如果没有元素加入,命令超过时间自动停止。

Redis解读(1):Redis安装启动及常见数据类型

另一客户端在阻塞时间加入新元素至k1链表

Redis解读(1):Redis安装启动及常见数据类型

Set

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。

sadd

添加元素到一个 key 中

Redis解读(1):Redis安装启动及常见数据类型

smembers

获取一个 key 下的所有元素

Redis解读(1):Redis安装启动及常见数据类型

srem

移除指定的元素

Redis解读(1):Redis安装启动及常见数据类型

sismemeber

返回某一个成员是否在集合中, 0 代表不存在, 1表示存在

Redis解读(1):Redis安装启动及常见数据类型

scard

返回集合的数量

Redis解读(1):Redis安装启动及常见数据类型

srandmember

随机返回一个元素

Redis解读(1):Redis安装启动及常见数据类型

spop

随机返回并且出栈一个元素

Redis解读(1):Redis安装启动及常见数据类型

smove

把一个元素从一个集合移到另一个集合中去

Redis解读(1):Redis安装启动及常见数据类型

sdiff

返回两个集合的差集,不同集合的顺序,差集结果是不一样的

Redis解读(1):Redis安装启动及常见数据类型

sinter

返回两个集合的交集

Redis解读(1):Redis安装启动及常见数据类型

sdiffstore

这个类似于 sdiff ,不同的是,计算出来的结果会保存在一个新的集合中

Redis解读(1):Redis安装启动及常见数据类型

sinterstore

类似于 sinter,只是将计算出来的交集保存到一个新的集合中

Redis解读(1):Redis安装启动及常见数据类型

sunion

求并集

Redis解读(1):Redis安装启动及常见数据类型

sunionstore

求并集并且将结果保存到新的集合中

Redis解读(1):Redis安装启动及常见数据类型

Hash

Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)。

hset

添加值

Redis解读(1):Redis安装启动及常见数据类型

hget

获取值

Redis解读(1):Redis安装启动及常见数据类型

hmset

批量设置

Redis解读(1):Redis安装启动及常见数据类型

hmget

批量获取

Redis解读(1):Redis安装启动及常见数据类型

hdel

删除一个指定的 field

Redis解读(1):Redis安装启动及常见数据类型

hsetnx

默认情况下,如果 key 和 field 相同,会覆盖掉已有的 value,hsetnx 则不会

Redis解读(1):Redis安装启动及常见数据类型

hvals

获取所有的 value

Redis解读(1):Redis安装启动及常见数据类型

hkeys

获取所有的 key

Redis解读(1):Redis安装启动及常见数据类型

hgetall

同时获取所有的 key 和 value

Redis解读(1):Redis安装启动及常见数据类型

hexists

返回 field 是否存在, 0 不存在, 1存在

Redis解读(1):Redis安装启动及常见数据类型

hincrby

给指定的 value 自增

Redis解读(1):Redis安装启动及常见数据类型

hincrbyfloat

可以自增一个浮点数

Redis解读(1):Redis安装启动及常见数据类型

hlen

返回 某一个 key 中 value 的数量

Redis解读(1):Redis安装启动及常见数据类型

hstrlen

返回某一个 key 中的某一个 field 的字符串长度

Redis解读(1):Redis安装启动及常见数据类型

ZSet

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

zadd

将指定的元素添加到有序集合中

Redis解读(1):Redis安装启动及常见数据类型

zscore

返回 member 的 score 值

Redis解读(1):Redis安装启动及常见数据类型

zrange

返回集合中的一组元素,可以加上 withscores 连同分数一起返回

Redis解读(1):Redis安装启动及常见数据类型

Redis解读(1):Redis安装启动及常见数据类型

zrevrange

返回一组元素,但是是倒序

Redis解读(1):Redis安装启动及常见数据类型

zcard

返回元素个数

Redis解读(1):Redis安装启动及常见数据类型

zcount

返回 score 在某一个区间内的元素,默认是闭区间,如果要开区间 在 score值 前面加上 (

Redis解读(1):Redis安装启动及常见数据类型

zrangebyscore

按照 score 的范围返回元素

Redis解读(1):Redis安装启动及常见数据类型

zrank

返回元素的排名(从小到大)

Redis解读(1):Redis安装启动及常见数据类型

zrevrank

返回元素排名(从大到小)

Redis解读(1):Redis安装启动及常见数据类型

zincrby

score自增

Redis解读(1):Redis安装启动及常见数据类型

zinterstore

给两个集合求交集,给交集求和

Redis解读(1):Redis安装启动及常见数据类型

zrem

弹出一个元素

Redis解读(1):Redis安装启动及常见数据类型

zlexcount

计算有序集合中成员数量

Redis解读(1):Redis安装启动及常见数据类型

zrangebylex

返回指定区间内的成员

Redis解读(1):Redis安装启动及常见数据类型

Key相关操作

del

删除一个 key/value

Redis解读(1):Redis安装启动及常见数据类型

dump

序列化给定的 key

Redis解读(1):Redis安装启动及常见数据类型

exists

判断一个 key 是否存在

Redis解读(1):Redis安装启动及常见数据类型

ttl

查看一个 key 的有效期 , -1 永不过期 , -2 已经过期

Redis解读(1):Redis安装启动及常见数据类型

expire

给一个 key 设置有效期,如果 key 在过期之前被重新 set 了,则过期时间会失效

Redis解读(1):Redis安装启动及常见数据类型

persist

移除一个 key 的过期时间

Redis解读(1):Redis安装启动及常见数据类型

keys *

查看所有的 key

Redis解读(1):Redis安装启动及常见数据类型

pttl

和 ttl 一样,只不过这里返回的是毫秒

Redis解读(1):Redis安装启动及常见数据类型

数据类型总结

  1. 四种数据类型(list/set/zset/hash),在第一次使用时,如果容器不存在,就自动创建一个
  2. 四种数据类型(list/set/zset/hash),如果里边没有元素了,那么立即删除容器,释放内存。