redis初识

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: redis初识

redis初识

1. Redis是什么

  • 开源
  • 基于建值对对存储服务系统
  • 多种数据结构
  • Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

官网:https://redis.io/

在这里插入图片描述

  • 高性能 ,功能丰富

2. Redis的前世今生

在这里插入图片描述

Redis的特性

  • 速度快

官方给出的 10w OPS
数据存在内存中,读取非常快
用c语言实现的(50000 line)
Redis 线程模型:单线程

在这里插入图片描述

  • 持久化

Redis所有的数据保存在内存中,对数据的更新将异步地保存在磁盘上
Redis 提供了 RDB,AOF持久化方式

  • 多种数据结构

String
Hash
List
Sets
Sorted Sets

-------
Redis 迭代中增加的数据结构

BitMaps : 位图
HyperLogLog :超小内存唯一计数
GEO :地理信息定位

  • 支持多种编程语言

在这里插入图片描述

  • 功能丰富

发布订阅
Lua脚本
事物
pipeline

  • "简单"

23000 lines of code
不依赖外部库 (like libevent)
单线程模型

  • 主从复制
    在这里插入图片描述
  • 高可用,分布式

高可用 :Redis-Sentinel (v2.8 )支持高可用
分布式 :Redis-Cluster (v3.0 ) 支持分数是

Redis使用场景

  • 缓存系统
  • 计数器
  • 消息队列系统
  • 排行榜
  • 社交网络
  • 实时系统

Redis的安装

在这里插入图片描述

可执行文件说明
  • redis-server -> Redis 服务器
  • redis- cli -> Redis命令行客户端
  • redis-benchmark -> Redis性能测试
  • redis-check-aof -> AOF修复工具
  • redis-check-dump -> RDB文件检查工具
  • redis-sentinel -> Sentinel服务器(2.8以后)
Redis常用配置
  • daemonize -> 是否是守护进程(no | yes)
  • port -> Redis对外端口
  • logfileile -> Redis 系统日志
  • dir -> Redis工作目录
  • RDB config
  • AOF config
  • slow Log config
  • maxMemory等等

数据结构和内部编码

在这里插入图片描述

单线程为什么这么快

  1. 纯内存
  2. 非阻塞IO
  3. 避免线程切换和竞争消耗

Redis API的使用和理解

1. 通用命令

keys : 遍历所有key

localhost:6379> keys *
 1) "b"
 2) "blog:90"
 3) "blog:71"
 4) "blog:80"
 5) "myset"
 6) "Back3"

dbsize : db长度

localhost:6379> dbsize
(integer) 21

exisits key : 判断key是否存在

localhost:6379> exists a
(integer) 1

del key :删除key

localhost:6379> del a
(integer) 1

expire key seconds :给key设置过期时间(秒)

localhost:6379> expire a 20
(integer) 1

ttl key :查看key 还有多长时间过期 (注:-1 永不过期,-2不存在)
persist key :去掉key的 过期时间

localhost:6379> ttl a
(integer) -2
localhost:6379> set a b
OK
localhost:6379> expire a 50
(integer) 1
localhost:6379> persist a
(integer) 1

type key :查看key 类型

localhost:6379> type a
string


2. 字符串类型

set 、 get 、 del 操作

localhost:6379> set a b
OK
localhost:6379> get a
"b"
localhost:6379> del a
(integer) 1

incr key 自增1,如果key不存在,自增后 get(key) = 1

decr key 自减1,如果key不存在,自减后get(key) = -1

incrby key k ,如果key不存在,自增后get(key) = k

localhost:6379> incr a
(integer) 4
localhost:6379> incr a
(integer) 5
localhost:6379> incr a
(integer) 6
localhost:6379> decr a
(integer) 5
localhost:6379> decr a
(integer) 4
localhost:6379> incrby a 20
(integer) 24

set key value : 进行覆盖操作,不管key是否存在

setnx key :不存在,才设置

setxx :key 存在,才设置

localhost:6379> set a 1234
OK
localhost:6379> SETNX a 20
(integer) 0
localhost:6379> setnx b 20
(integer) 0
localhost:6379> setnx yxl 20
(integer) 1
localhost:6379> set a b xx
OK

mget key1 key2 key3 : 批量获取key,原子操作

mset key1 value1 key2 value2 : 批量设置key - value

localhost:6379> mget a b
1) "b"
2) "456"
localhost:6379> mset a 200 b 500
OK

getset key newvalue : set key newvalue 并返回旧的value

append key value : 将value 追加到旧到value

strlen key :返回字符串到长度

localhost:6379> getset a a
"200"
localhost:6379> APPEND a bcd
(integer) 4
localhost:6379> get a
"abcd"
localhost:6379> strlen a
(integer) 4

incrbyfloat key 3.5 : 增加key 对应的值3.5

getrange key start end : 获取字符串指定下标的所有值

setrange key index value :设置指定下标新的值

localhost:6379> incrbyfloat max 3.5
"3.5"
localhost:6379> getrange max 0 1
"3."
localhost:6379> setrange max 1 23
(integer) 3
localhost:6379> get max
"323"
  • 哈希类型

hget key field : 获取hash key 对应的field 的value

hset key field value : 设置hash key 对应的field 的 value

hdel key fiela

localhost:6379> hget user:1:info age 
"23"
localhost:6379> hset user:1:info age 23 sex 男
(integer) 0
localhost:6379> hset user: age 23 sex 男
(integer) 2
localhost:6379> hget user: age
"23"
localhost:6379> hset user: name 1234
(integer) 1
localhost:6379> hgetall user:
1) "age"
2) "23"
3) "sex"
4) "\xe7\x94\xb7"
5) "name"
6) "1234"
localhost:6379> hdel user: age
(integer) 1

hexists : 判断hash key 是否有 field

hlen : 获取 hash key field 的数量

localhost:6379> HGETALL user:
1) "sex"
2) "\xe7\x94\xb7"
3) "name"
4) "1234"
localhost:6379> hexists user: name
(integer) 1
localhost:6379> hlen user:
(integer) 2

hmget : hmget key field1 field 2 ......

hmset : hmset key field1 value1 field2 value2 .....

localhost:6379> hmset user2 age 30 name kaka
OK
localhost:6379> hlen user2
(integer) 2
localhost:6379> hmget user2 age name
1) "30"
2) "kaka"

hgetall :返回hash key 对应所有的field 和 value

hvals :返回hash key 对应所有 field 的value

hkeys :返回hash key 对应所有field

localhost:6379> HGETALL user2
1) "age"
2) "30"
3) "name"
4) "kaka"
localhost:6379> HVALS user2
1) "30"
2) "kaka"
localhost:6379> hkeys user2
1) "age"
2) "name"

在这里插入图片描述

  • 列表类型

rpush : 从列表右端插入值(1-N个)

lpush : 从列表左端插入值(1-N个)

127.0.0.1:6379> rpush list1 1 2 3
(integer) 6
127.0.0.1:6379> lpush list2 1 2 3
(integer) 3

linsert : 在list 指定的值前|后插入 newValue

127.0.0.1:6379> linsert list2 before 2 1234
(integer) 4
127.0.0.1:6379> linsert list2 after 2 1234
(integer) 5

lpop : 从列表左侧弹出一个item

rpop : 从列表右侧弹出一个item

127.0.0.1:6379> lpop list2
"3"
127.0.0.1:6379> rpop list2
"1"

lrem : 根据count值,从列表中删除所有value相等的项

127.0.0.1:6379> lrem list1 0 1
(integer) 2

ltrim : 按照索引范围修剪列表

lrange :获取列表指定索引范围所有item

OK
127.0.0.1:6379> lrange list2 0 -1
1) "1234"
2) "2"
3) "1234"

lindex : 获取指定列表的item

llen : 获取列表长度

lset : 设置列表指定索引值为newValue

127.0.0.1:6379> LINDEX list1 0
"3"
127.0.0.1:6379> llen list1
(integer) 2
127.0.0.1:6379> lset list1 0 1234
OK
127.0.0.1:6379> lrange list1 0 -1
1) "1234"
2) "3"
  • 集合类型

sadd : 向集合key添加element(如果存在就添加失败)

scard : 计算集合大小

sismember : 判断it 是否在集合中

srandmember : 从集合中随机挑count 个元素

spop : 从集合中随机弹出一个元素\

127.0.0.1:6379> sadd set1 1234
(integer) 1
127.0.0.1:6379> 
127.0.0.1:6379> scard set1
(integer) 1
127.0.0.1:6379> sismember set1 1
(integer) 0
127.0.0.1:6379> sismember set1 1234
(integer) 1
127.0.0.1:6379> SRANDMEMBER set1 2
1) "1234"
2) "7"
127.0.0.1:6379> spop set1 1
1) "6"

  • 有序集合类型

    在这里插入图片描述

zadd : 添加score 和 element

zrem : 删除元素

127.0.0.1:6379> zadd zset 1 1234
(integer) 1
127.0.0.1:6379> 
127.0.0.1:6379> zrem zset 1234
(integer) 1

zincrby : 增加或减少元素的分数

zcard : 返回元素的总个数

zscore : 返回分数

127.0.0.1:6379> ZINCRBY zset 1 1
"1"
127.0.0.1:6379> zcard zset
(integer) 1
127.0.0.1:6379> zscore zset 1
"1"

zrange : 返回指定索引内升序元素

zrangebyscore : 返回指定分数范围内升序元素

zremrangebyrank : 删除指定排名内升序元素

zremrangebyscore : 删除指定分数内升序元素

127.0.0.1:6379> zadd player 1000 ronaldo 900 messi 800 c-aa
(integer) 3
127.0.0.1:6379> zrange player 0 -1
1) "c-aa"
2) "messi"
3) "ronaldo"
127.0.0.1:6379> zcount player 900 1000
(integer) 2
127.0.0.1:6379> zrangebyscore player 1000 1001
1) "ronaldo"
127.0.0.1:6379> 
127.0.0.1:6379> zremrangebyrank player 0 1
(integer) 2
127.0.0.1:6379> zrange player 0 -1
1) "ronaldo"

在这里插入图片描述

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
存储 NoSQL 程序员
初识Redis
Redis简介 Redis(REmote DIctionary Server) 是一个由Salvatore Sanfilippo写的key-value存储系统。
901 0
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6
|
1月前
|
缓存 NoSQL 关系型数据库
redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
本文深入探讨了Redis缓存的相关知识,包括缓存的概念、使用场景、可能出现的问题(缓存预热、缓存穿透、缓存雪崩、缓存击穿)及其解决方案。
173 0
redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿
|
6天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
7天前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构
|
15天前
|
缓存 NoSQL Redis
Redis 缓存使用的实践
《Redis缓存最佳实践指南》涵盖缓存更新策略、缓存击穿防护、大key处理和性能优化。包括Cache Aside Pattern、Write Through、分布式锁、大key拆分和批量操作等技术,帮助你在项目中高效使用Redis缓存。
90 22
|
14天前
|
缓存 NoSQL 中间件
redis高并发缓存中间件总结!
本文档详细介绍了高并发缓存中间件Redis的原理、高级操作及其在电商架构中的应用。通过阿里云的角度,分析了Redis与架构的关系,并展示了无Redis和使用Redis缓存的架构图。文档还涵盖了Redis的基本特性、应用场景、安装部署步骤、配置文件详解、启动和关闭方法、systemctl管理脚本的生成以及日志警告处理等内容。适合初学者和有一定经验的技术人员参考学习。
103 7