目录第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 整数NEX 设置过期时间/sPX 设置过期时间/msEXPIRE 重置/设置过期时间NX 非则doGETSET 取后改INCRBYFLOAT 浮点数0.0SETEX / 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 # 单打独斗DELSET 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 zh3shxx.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 # zh3shxx.com # 获取所有字段和值 HGETALL user:219 # name # 张3sh # age # 22 # email # zh3shxx.com # 只修改邮箱 HSET user:219 email new_zh3shxx.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----------------------------------------------------------敬请期待----------------------------------------------------------