Redis 学习笔记

本文是 Redis 学习笔记,涵盖了 Redis 的安装、性能测试、基础及高级数据类型、事务处理、Jredis 使用、Spring Boot 整合、Redis.conf 配置详解以及持久化机制等内容。通过实战示例,深入理解 Redis 的各项功能。
摘要由CSDN通过智能技术生成

Redis 入门

b 站 【狂神 Redis 视频】

安装 Redis

通过指定的配置文件 redis.conf 启动 redis 服务
在这里插入图片描述
在这里插入图片描述

使用 redis-cli 连接 6379 端口
在这里插入图片描述
在这里插入图片描述

测试 get、set、keys * 命令
在这里插入图片描述

关闭 redis
在这里插入图片描述
在这里插入图片描述

性能测试

redis-benchmark(官方自带的性能测试工具)
在这里插入图片描述

# 测试:100 个并发连接 100000 请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000

在这里插入图片描述

Redis 基础知识

Redis 默认有 16 个数据库
在这里插入图片描述

默认使用的是第 0 个

  • select 进行切换数据库
  • DBSIZE 查看数据库大小
    在这里插入图片描述
  • flushdb 清空当前数据库
  • flushall 清空全部数据库
    在这里插入图片描述

Redis 是单线程的(6.0 之后是多线程的)

  • Redis 是很快的,官方表示 Redis 是基于内存操作,CPU 不是 Redis 性能瓶颈,Redis 的瓶颈是机器内存和网络带宽,既然可以使用单线程来实现,就使用单线程了

Redis 是 C 写的,官方提供数据为 100000+ 的 QPS,不比同样使用 key-value 的 memecache 差

Redis 为什么单线程还这么快?

  • 误区 1:高性能的服务器一定是多线程的
  • 误区 2:多线程(CPU上下文切换:耗时的操作)一定比单线程效率高(速度:CPU > 内存 > 硬盘)
  • 核心:Redis 是将所有的数据全部放在内存中的,所以使用单线程操作效率最高

五大数据类型

在这里插入图片描述

Redis-Key
127.0.0.1:6379> set name Jarvis
OK
127.0.0.1:6379> set age 3
OK
127.0.0.1:6379> exists name # 判断当前 key 是否存在
(integer) 1
127.0.0.1:6379> move name 1 # 将当前 key 从当前数据库移到 1 数据库
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "name"
127.0.0.1:6379[1]> move name 0
(integer) 1
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> expire name 20 # 设置当前 key 20 秒后过期
(integer) 1
127.0.0.1:6379> ttl name # 查看倒计时还有几秒👆
(integer) 16
127.0.0.1:6379> ttl name
(integer) 8
127.0.0.1:6379> ttl name
(integer) 7
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> type name # 查看当前 key 的类型
string
127.0.0.1:6379> type age
string

String(字符串)
127.0.0.1:6379> set key1 v1
OK
127.0.0.1:6379> get key1
"v1"
127.0.0.1:6379> append key1 "hello" # 追加字符串,如果该键不存在,相当于 set key
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> strlen key1 # 获取字符串的长度
(integer) 7
127.0.0.1:6379> append key1 ",Jarvis"
(integer) 14
127.0.0.1:6379> get key1
"v1hello,Jarvis"
127.0.0.1:6379> 

127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views # 相当于 views++ 自增1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> type views
string
127.0.0.1:6379> decr views # 相当于 views-- 自减1
(integer) 1
127.0.0.1:6379> incrby views 10 # 相当于 views += 10
(integer) 11
127.0.0.1:6379> decrby views 10 # 相当于 views -= 10
(integer) 1
127.0.0.1:6379> 

127.0.0.1:6379> set key1 "hello,Jarvis"
OK
127.0.0.1:6379> get key1
"hello,Jarvis"
127.0.0.1:6379> getrange key1 0 3 # 截取字符串 [0, 3]
"hell"
127.0.0.1:6379> getrange key1 0 -1 # 获取全部字符串
"hello,Jarvis"
127.0.0.1:6379> 
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> setrange key2 1 xx # 替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"

# setex(set with expire) 设置到期时间
# setnx(set if not exists) 如果不存在...(在分布式锁中会常用)
127.0.0.1:6379> setex key3 30 hello
OK
127.0.0.1:6379> ttl key3
(integer) 25
127.0.0.1:6379> setnx key4 redis
(integer) 1
127.0.0.1:6379> keys *
1) "key2"
2) "key1"
3) "key4"
127.0.0.1:6379> setnx key4 mongoDB
(integer) 0
127.0.0.1:6379> get key4
"redis"
127.0.0.1:6379> 

127.0.0.1:6379> mset key1 v1 key2 v2 key3 v3 # 同时设置多个值
OK
127.0.0.1:6379> keys *
1) "key3"
2) "key2"
3) "key1"
127.0.0.1:6379> mget key1 key2 key3 # 同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx key1 v1 key4 v4 # 原子性操作,要么都成功,要么都失败
(integer) 0
127.0.0.1:6379> 
# 对象
127.0.0.1:6379> set user:1 {
   name:zhangsan,age:3} # 设置一个 user:1 对象,值为 json字符来保存对象
OK
127.0.0.1:6379> get user:1
"{name:zhangsan,age:3}"
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 12
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "12"
127.0.0.1:6379> 
127.0.0.1:6379> getset db redis
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongoDB
"redis"
127.0.0.1:6379> get db
"mongoDB"
127.0.0.1:6379> 

String 类型使用场景(value 可以是数字):

  • 计数器
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存存储
List
  • 基本的数据类型,列表
  • 在 Redis 中,可以把 List 玩成 栈、队列、阻塞队列
# l 和 r 是 left 和 right 的意思
# 双端队列
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> rpush list four
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> 
127.0.0.1:6379> keys *
1) "list"
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> lpop list 
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值