Redis 菜鸟学习
目录
第1章 Redis入门——五个核心的数据结构
Redis 简介
1. Redis 是什么?
2. Redis 的典型应用场景(它用来干嘛?)
3. 开启命令面板、退出、中文显示
4. 侦探三件套
字符串(String)—— 最基础的存储单元
基本操作(部分)
散列(Hash)—— 专门用来存“对象”
基本操作(部分)
第1章 Redis入门——五个核心的数据结构
Redis 简介
1. Redis 是什么?
简单说,Redis 是一个基于内存的、键值对存储的 NoSQL 数据库。我们拆开理解这几个关键词:
基于内存:数据全放在电脑的内存条(RAM)里,而不是硬盘上。内存的读写速度是硬盘的几百甚至上千倍,所以 Redis非常非常快。
键值对(Key-Value):像一本巨大的字典。你想存一个数据,给它起个名字(Key),然后把内容(Value)塞进去。取的时候只要报名字,内容瞬间就出来了。
NoSQL:意味着它不是传统的表格型数据库(像 MySQL 那种一行行一列列的),而是更灵活的数据结构存储。
2. Redis 的典型应用场景(它用来干嘛?)
因为它快,所以主要用在需要高性能、低延迟的地方:
缓存(Cache):这是最核心的用法。比如网站的首页有 10 万条商品数据,每次去 MySQL 硬盘查太慢了。可以把数据存一份在 Redis 里,用户访问先看 Redis 有没有,有的话瞬间返回,没有再去 MySQL 查。
计数器:比如文章的阅读量、视频的点赞数。用传统数据库频繁写硬盘扛不住,用 Redis 内存操作毫无压力。
排行榜:比如游戏积分榜、热搜榜。Redis 的数据结构天然支持排序。
分布式锁:多台服务器抢一个任务时,用 Redis 来协调“谁来做”。
消息队列:暂时存放待处理的任务数据。
3. 开启命令面板、退出、中文显示
# 开启命令面板 redis-cli #退出命令面板 exit # Redis CLI 默认用十六进制展示中文 # 正常显示 redis-cli --raw4. 侦探三件套
# 检查键是否存在 EXISTS user:110 # 存在 1 # 不存在 0 # 检查键的类型 TYPE user:110 # string 普通字符串 # hash 散列 # list 列表 # set 集合 # zset 有序集合 # none undefined # 检查过期时间 TTL user:110 # -2 不存在 # -1 无过期时间 # (正数) 存在,还有(正数)秒过期字符串(String)—— 最基础的存储单元
什么是 Redis 字符串?
它是Redis里最简单的键值对。Value可以是普通文字、数字,甚至是二进制的图片数据。虽然叫字符串,但它对数字操作有特殊优化,可以直接做加减运算
基本操作(部分)
SET 存,GET 取,DEL 删,INCR 整数++,INCRBY 整数+N,EX 设置过期时间/s,PX 设置过期时间/ms,EXPIRE 重置/设置过期时间,NX 非则do,
GETSET 取后改,INCRBYFLOAT 浮点数+0.0,SETEX / PSETEX 存设过期,SETNX 非则设,
STRLEN 取长,APPEND 追加,GETRANGE 取子串
Redis中单引号 ' ' 和双引号 " " 没区别,如果字符串中间不含空格,完全可以不用
key中 ":" 只是命名风格(类似驼峰命名法),可读性
SET
# SET key value SET username "单打独斗对弟弟" SET age 22 # 应用场景 : # 缓存 JSON 数据 SET user:1 '{"username ":"单打独斗对弟弟","age":22}' # 把数据库查出来的用户信息转成字符串塞进 Redis,下次直接取,避免频繁查数据库GET、GETSET
# GET key # value GET username # 单打独斗对弟弟 GET age # 22 # GETSET # 设置新值并返回旧值 GETSET username "单打独斗" # 单打独斗对弟弟 GET username # 单打独斗DEL
SET temp "gg" GET temp # gg DEL temp GET temp # (nil)INCR
# incr 是 redis 的原子自增命令 # key 必须数字类型 # 如果 key 不存在,会自动创建,初始化为 0,后 +1 # key = 0; key++; INCR key GET key # 1 # 应用场景: # 计数器 INCR article:readcount # 每刷一次文章,阅读量加一 # 非常安全INCRBY
# key = 1; INCRBY key 69 # 70EX、SETEX、PX、PSETEX
# EX 单位 秒/s # PX 单位 毫秒/ms SET temp "用户UID" EX 60 # # SETEX temp "用户UID" 60 # # SET temp "用户UID" PX 60000 # # PSETEX temp "用户UID" 60000 # 60s 内 GET temp # 用户UID # 超过 60s 过期 GET temp # (nil) # 应用场景 # 分布式 Session 存储 # 把用户的登录 Token 存在 key 里,设置过期时间,多个服务器都能读取,解决分布式登录同步问题EXPIRE
# 重置 temp 过期时间 EXPIRE temp 30 # 应用场景: # 限流 # 限制用户 1 分钟内最多只能请求 5 次短信验证码 # 每次请求,执行 INCR INCR user:api:zhangsan # 第一次,返回值是 1 # 配合 EXPIRE 重置时间窗口。 EXPIRE user:api:zhangsan 60 # 返回值 大于 5,拒绝请求NX、SETNX
# if(!temp){ # String/Integer temp; # } # temp 初始不存在,允许创建 # 两种写法 # SET key value NX # # SETNX key value SET temp "用户Token" NX # SETNX temp "用户Token" # OK SET temp "用户UID" NX # SETNX temp "用户UID" # (nil) DEL temp SET temp "用户UID" NX # SETNX temp "用户UID" # OK # 应用场景: # 分布式锁 SET lock:order:1001 unique_id NX EX 30 # 利用 NX(不存在才设置)和 EX(过期)特性,让多个服务在单位时间内互斥STRLEN
# 获取值的长度 # username = "单打独斗对弟弟"; STRLEN username # 21APPEND
# 给值追加内容 # username = "单打独斗对" APPEND username "弟弟" GET username # 单打独斗对弟弟GETRANGE
# 获取值的子串(索引从 0 开始) # name = "zhangsan" # username = "单打独斗对弟弟" GETRANGE name 4 6 # gsa GETRANGE username 15 20 # 弟弟散列(Hash)—— 专门用来存“对象”
基本操作(部分)
HSET 存、HGET 取、HMGET 批量取、HKEYS 取key、HVALS 取value、HGETALL 取全部key-value、
HINCRBY value++、HDEL 删、HLEN 得key数量、HEXISTS 判存
# 设置多个字段 HSET user:219 name 张3sh age 22 email zh3sh@xx.com # OK # 获取字段 HGET user:219 name # 张3sh # 批量获取 HMGET user:219 name age # 张3sh # 22 # 获取所有字段 HKEYS user:219 # name # age # email # 获取所有值 HVALS user:219 # 张3sh # 22 # zh3sh@xx.com # 获取所有字段和值 HGETALL user:219 # name # 张3sh # age # 22 # email # zh3sh@xx.com # 只修改邮箱 HSET user:219 email new_zh3sh@xx.com # 0 # 数值操作 HINCRBY user:219 age 11 # 33 HINCRBY user:219 age -11 # 22 # 删除一个字段 HDEL user:219 email # 获取字段数量 HLEN user:219 # 2 # 判断字段是否存在 HEXISTS user:219 name # 1 HEXISTS user:219 email # 0----------------------------------------------------------敬请期待----------------------------------------------------------
