【Redis】Redis 介绍与5种基本数据类型

Redis概述

前置概念:NoSQL是什么?

Nosql = not only sql(不仅仅是SQL)

RDBMS关系型数据库:列+行的形式,同一个表下数据的结构是一样的。

Nosql非关系型数据库:数据存储没有固定的格式,并且可以进行横向扩展。NoSQL泛指非关系型数据库

与传统型数据库的区别

RDBMS型
 - 组织化结构,即同一张表的数据的结构都是一样的
 - 固定SQL
 - 数据和关系都存在单独的表中(行列)
 - DML(数据操作语言)、DDL(数据定义语言)等
 - 严格的一致性(ACID): 原子性、一致性、隔离性、持久性
 - 基础的事务
NoSQL型
 - 不仅仅是数据
 - 没有固定查询语言
 - 键值对存储(redis)、列存储(HBase)、文档存储(MongoDB)、图形数据库(不是存图形,放的是关系)(Neo4j)
 - 最终一致性(BASE):基本可用、软状态/柔性事务、最终一致性

Redis是什么?

​ Redis = Remote Dictionary Server,即远程字典服务。

​ 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、基于Key-Value的NoSQL数据库,并提供多种语言的API。

​ 可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 安装(docker环境下)

拉取镜像

docker search redis;
docker pull redis:latest;

创建Redis容器并启动

docker run -it --name redis_6379  -p 6379:6379 -d redis; # 未设置密码

启动Redis 程序

进入容器

docker exec -it redis_6379 bash;

image-20231019191107474

Redis压力测试

redis-benchmark -c 100 -n 10000 -t set,get -P 60 -q 
# -c: 指定并发连接数 默认为50 -n: 请求数 默认为10000 -q:退出redis -P:通过管道输出请求
#其他参数列举:
# -h:指定服务器主机名,默认为本机127.0.0.1
# -p:指定服务器端口,默认为6379

启动Redis客户端

redis-cli;
ping #测试是否成功启动 返回PONG即成功

image-20231019194752406

通用命令

1. keys * #查看redis所有数据的key
2. del del key [key ...] # 删除指定的key,可以是一个或多个,成功则返回删除key的个数,失败则返回0
3. expire key seconds  # 指定几秒后删除指定的key

image-20231019194517106

5种核心基本数据类型及其常用指令

​ 首先对redis来说数据都是按照Key-Value进行存储的,所有的key(键)都是字符串。在谈基础数据类型时,讨论的是存储值Value的数据类型,主要包括常见的5种数据类型,分别是:String、List、Set、Sorted Set、Hash。

image-20231019192754543

String(字符串):

​ Redis中String 类型是二进制安全的。意味着Redis的String可以包含任何数据,可以是简单字符串、复杂的xml/json的字符串、二进制图像或者音频的字符串、以及数字的字符串。

​ Redis中一个String类型的Value最多存储大小是512M。

底层数据结构

String类型的数据结构为简单动态字符串(SimpleDynamicString,缩写SDS)是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

image-20231019193658436

常用命令
1.  set key value
# 添加键值对,key就是键,value就是字符串,若添加的key已经存在,则会将key原本对应的value覆盖(redis的键值对类比java中的map)
127.0.0.1:6379> set myStr hello
OK
2. get key
# 获取指定的key的value值
127.0.0.1:6379> get myStr # 成功则返回字符串值
"hello"
127.0.0.1:6379> get mykkk # 失败则返回nil(类比java中的null)
(nil)   

3. mget key [key ...]
# 获取 一个或多个key的value值
127.0.0.1:6379> mget myStr myStr1
1) "hello"
2) "world"
4. setnx key value [重点]
# 添加一个键值对,若key已经存在则添加失败,返回0,而不是覆盖,添加成功返回1,而不是OK
127.0.0.1:6379> setnx myStr 4
(integer) 0 #失败
127.0.0.1:6379> setnx myStrNew success
(integer) 1 #成功
5.  strlen key
# 获取指定key对应value字符串的长度
127.0.0.1:6379> strlen myStr # "hello"
(integer) 5
6. incr key
# 将指定的key对应的value 整数字符串 的值+1 ,返回增加后的整数值
127.0.0.1:6379> incr myStr # "hello"  
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set num 345
OK
127.0.0.1:6379> incr num
(integer) 346
7. decr key 
#将指定的key对应的value 整数字符串 的值-1 ,返回减少后的整数值
8. append key value
# 在指定key的value字符串中添加字符串
127.0.0.1:6379> append myStr abc
(integer) 8
127.0.0.1:6379> get myStr
"helloabc"
使用场景

缓存:把常用信息,字符串,图片或者视频等信息放到Redis中,Redis作为缓存层,MySQL做持久化层,降低MySQL的读写压力

计数器:Redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。

Session:常见方案如:Spring Session + Redis实现Session共享

List(列表):

底层数据结构

​ Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。它的底层实际是个双向链表,这意味着List的插入和删除操作效率会比较快,时间复杂度是O(1)。

image-20231019202113280

常用命令
1. lpush key element [element ...]
# 指定 key 每次从最左边(表头)添加向key中添加一个或多个元素 ,添加元素的顺序与列表中元素的顺序相反
127.0.0.1:6379> lpush mylist 1 2 3 4 5 6
(integer) 6

2. lrange key start stop
# 从左边(表头)指定key 的区间内获取的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素
127.0.0.1:6379> lrange mylist 0 5
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"   #可以看到lpush命令每次添加的元素,永远位于最左边(表头),类似栈,先添加的元素在表后,后添加的元素在表前
127.0.0.1:6379> lrange mylist  -3 -1  #获取倒数第3到倒数第1的元素
1) "3"
2) "2"
3) "1"

3.  rpush key element [element ...]
# 指定key 每次从最右边(表尾)添加一个或多个元素,添加顺序与元素中顺序一致
127.0.0.1:6379> rpush myRlist 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> lrange myRlist 0 5
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"

4.  lpop key [count]
# 从指定key的表头移除指定个数的元素 ,返回移除的元素
127.0.0.1:6379> lpop mylist 
"6"
127.0.0.1:6379> lpop mylist 2
1) "5"
2) "4"

5. rpop key [count]
# 从指定key的表尾移除指定个数的元素 ,返回移除的元素
127.0.0.1:6379> lrange myRlist 0 5
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> rpop myRlist 2
1) "6"
2) "5"

6. llen key
# 获取指定key列表元素的个数(长度)
127.0.0.1:6379> llen mylist
(integer) 3
127.0.0.1:6379> lrange mylist 0 2
1) "3"
2) "2"
3) "1"

7. lrem key count element
# 根据参数 COUNT 的值,移除列表中与参数 element 相等的元素。
# COUNT 的值有以下几种:
# count > 0 : 从表头开始向表尾搜索,移除与 element 相等的元素,数量为 COUNT 。
# count < 0 : 从表尾开始向表头搜索,移除与 element 相等的元素,数量为 COUNT 的绝对值。
# count = 0 : 移除表中所有与 element 相等的值
使用场景

消息队列:List类型的lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而可以用Redis的List类型实现简单的点对点的消息队列。

Set(集合):

​ Redis的Set是String类型的无序集合,对外提供的功能与List类似是一个列表的功能,特殊之处在于Set是可以自动排重的,即元素不重复,此外Set提供了判断某个成员是否在一个Set集合内的重要接口,这个也是List所不能提供的。

底层数据结构【待补充】
常用命令
1.  sadd key member [member ...]
# 添加一个或多个元素到指定key 的set中
127.0.0.1:6379> sadd mySet 1 2 3 4 4 5 5 6
(integer) 6

2. smembers key
# 获取指定key的元素
127.0.0.1:6379> smembers mySet
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"

3. scard key
# 返回指定key的元素个数
127.0.0.1:6379> scard mySet
(integer) 6

4. sismember key member
# 判断key中是否有member这个元素
127.0.0.1:6379> sismember mySet 1
(integer) 1    # 存在返回1
127.0.0.1:6379> sismember mySet 9
(integer) 0   # 不存在返回0

5. spop key [count]
# 随机弹出指定count数量的元素
127.0.0.1:6379> spop mySet 3
1) "1"
2) "3"
3) "2"
127.0.0.1:6379> smembers mySet
1) "4"
2) "5"
3) "6"

6.  srandmember key [count]
# 随机获取指定count数量的元素,不会删除元素
127.0.0.1:6379> srandmember mySet 2
1) "6"
2) "5"
127.0.0.1:6379> smembers mySet
1) "4"
2) "5"
3) "6"

7.  srem key member [member ...]
# 从指定key的set中移除元素member
127.0.0.1:6379> srem mySet 5
(integer) 1
127.0.0.1:6379> smembers mySet
1) "4"
2) "6"

Sorted Set(有序集合):

​ Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的评分(scroe)。集合的成员是唯一的,但是评分是可以重复的。redis 正是通过分数来为集合中的成员进行从小到大的排序。

底层数据结构【待补充】
常用命令
1. zadd key score member [score member ...]
# 指定key中添加评分和元素值
127.0.0.1:6379> zadd Zset 10.0 zs 10.0 ls 9.0 ww 8 zao
(integer) 4

2. zrangebyscore key min max
# 指定key 获取 SortedSet 中的 min评分 到 max评分范围内的member值,按照从小到大顺序
127.0.0.1:6379> zrangebyscore Zset 8 10.0
1) "zao"
2) "ww"
3) "ls"
4) "zs"

3. zrange key start stop
# 获取SortedSet的start到stop下标范围内的member的值,0为第一个元素,-1为倒数一个元素 ,按照score评分从小到大排序
127.0.0.1:6379> 127.0.0.1:6379> zrange Zset 0 -1 
1) "zao"
2) "ww"
3) "ls"
4) "zs

4. zrevrange key start stop 
# 获取SortedSet的start到stop下标范围内的member的值,0为第一个元素,-1为倒数一个元素 ,按照score评分大到小排序
127.0.0.1:6379> zrevrange Zset 0 -1
1) "zs"
2) "ls"
3) "ww"
4) "zao"

5. zcard key
# 获取指定SortedSet的成员数量
127.0.0.1:6379> zcard Zset
(integer) 4

6.  zscore key member
# 获取指定ZSet中member的评分
127.0.0.1:6379> zscore Zset zao
"8"

7.  zrem key member [member ...]
# 移除指定key中的成员

Hash(哈希表):

底层数据结构【待补充】

​ Redis hash 本身是一个键值对。而其value值又是一个Map集合,里面可以有多个field-value

常用命令
1. hset key field value [field value ...]
# 指定key 的hash表中添加一个或多个 field-value对
127.0.0.1:6379> hset myHash a 1 b color c 3 d 4 e 5
(integer) 5
127.0.0.1:6379> hset person person:id 1001 person:name wang person:age 20 person:hobby coding
(integer) 4  # 可读性更好的写法


2. hget key field
#  获取指定key hash表的 field 的value值
127.0.0.1:6379> hget person person:id
"1001"

3.  hgetall key
# 获取key所有的field域和value值 
127.0.0.1:6379> hgetall person
1) "person:id"
2) "1001"
3) "person:name"
4) "wang"
5) "person:age"
6) "20"
7) "person:hobby"
8) "coding"

4.  hkeys key 、 hvals key
# 获取hash表所有的field 、value
127.0.0.1:6379> hkeys person
1) "person:id"
2) "person:name"
3) "person:age"
4) "person:hobby"
127.0.0.1:6379> hvals person
1) "1001"
2) "wang"
3) "20"
4) "coding"

5. hexists key field
# 判断指定key的hash表中是否存在field
127.0.0.1:6379> hexists person person:age
(integer) 1  # 存在返回1, 失败返回0

6. hlen key
# 获取指定key的hash表的field个数
127.0.0.1:6379> hlen person
(integer) 4

7. hsetnx key field value
# 当hash表中不存在指定field时,添加value值
127.0.0.1:6379> hsetnx person person:id 1002
(integer) 0  #添加失败返回0
127.0.0.1:6379> hsetnx person person:weight 65
(integer) 1
127.0.0.1:6379> hvals person
1) "1001"  # person:id 未改变值
2) "wang"
3) "20"
4) "coding"
5) "65"

8.  hincrby key field increment
# 将指定key的field 添加 increment值
127.0.0.1:6379> hincrby person person:id 1
(integer) 1002
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值