redis初识

本文涉及的产品
云数据库 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存储系统。
880 0
|
1月前
|
存储 NoSQL 算法
09- Redis分片集群中数据是怎么存储和读取的 ?
Redis分片集群使用哈希槽分区算法,包含16384个槽(0-16383)。数据存储时,通过CRC16算法对key计算并模16383,确定槽位,进而分配至对应节点。读取时,根据槽位找到相应节点直接操作。
66 12
|
1月前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
365 0
|
1月前
|
负载均衡 监控 NoSQL
Redis的集群方案有哪些?
Redis集群包括主从复制(基础,手动故障恢复)、哨兵模式(自动高可用)和Redis Cluster(官方分布式解决方案,自动分片和容错)。此外,还有如Codis、Redisson和Twemproxy等第三方工具用于代理和负载均衡。选择方案需考虑应用场景、数据规模和并发需求。
290 2
|
2天前
|
存储 监控 NoSQL
Redis哨兵&分片集群
Redis哨兵&分片集群
6 0
|
3天前
|
NoSQL 算法 Java
深入浅出Redis(八):Redis的集群模式
深入浅出Redis(八):Redis的集群模式
|
8天前
|
NoSQL Redis
透视Redis集群:心跳检测如何维护高可用性
Redis心跳检测保障集群可靠性,通过PING命令检测主从连接状态,预防数据丢失。当连接异常时,自动触发主从切换。此外,心跳检测辅助实现`min-slaves-to-write`和`min-slaves-max-lag`策略,避免不安全写操作。还有重传机制,确保命令无丢失,维持数据一致性。合理配置心跳检测,能有效防止数据问题,提升Redis集群的高可用性。关注“软件求生”获取更多Redis知识!
109 10
透视Redis集群:心跳检测如何维护高可用性
|
11天前
|
监控 NoSQL 算法
Redis集群模式:高可用性与性能的完美结合!
小米探讨Redis集群模式,通过一致性哈希分散负载,主从节点确保高可用性。节点间健康检测、主备切换、数据复制与同步、分区策略和Majority选举机制保证服务可靠性。适合高可用性及性能需求场景,哨兵模式则适用于简单需求。一起学习技术的乐趣!关注小米微信公众号“软件求生”获取更多内容。
44 11
Redis集群模式:高可用性与性能的完美结合!
|
12天前
|
监控 NoSQL Redis