redis初识

本文涉及的产品
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 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存储系统。
893 0
|
18天前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
|
18天前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Redission客户端连接Azure:客户端出现 Unable to send PING command over channel
【Azure Redis 缓存】Redission客户端连接Azure:客户端出现 Unable to send PING command over channel
|
18天前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
18天前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Redis 连接失败
【Azure Redis 缓存】Redis 连接失败
|
18天前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
|
14天前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
32 0
|
18天前
|
缓存 NoSQL Redis
【Azure Redis 缓存】使用StackExchange.Redis,偶发ERROR - Timeout performing HSET (15000ms)
【Azure Redis 缓存】使用StackExchange.Redis,偶发ERROR - Timeout performing HSET (15000ms)
|
18天前
|
缓存 NoSQL Java
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务