没长正的技术专栏 勤动手、多思考

Redis

2014-01-06

阅读:

2020-08-11

1.定义、应用场景、原理、项目实战

1.1 定义

Redis 是一个高性能的key-value数据库,支持主从同步、集群模式。

1.2 应用场景

1.2.1 REDIS缓存穿透,缓存击穿,缓存雪崩原因+解决方案

缓存穿透:key对应的数据源不存在,redis访问不到,直接访问DB,IO频繁甚至崩溃;

缓存击穿:key对应的数据源存在,在redis中失效,大并发过来,直接访问DB,IO频繁甚至崩溃;

缓存雪崩:当缓存服务重启或大量缓存失效,大并发过来,直接访问DB,IO频繁甚至崩溃;

图解

穿透(key不存)=》 击穿 =》雪崩(升级版击穿)
1.2.2 redis脑裂

重新选举(哨兵模式)

> 每个从节点,都根据自己对 master 复制数据的 offset,来设置一个选举时间,offset 越大(复制数据越多)的从节点,选举时间越靠前,优先进行选举。

> 所有的 master node 开始 slave 选举投票,给要进行选举的 slave 进行投票,如果大部分 master node (N/2 + 1) 都投票给了某个从节点,那么选举通过,那个从节点可以切换成 master。

1.3 原理

如何通信?

  • gossip协议

2021-09-18_redis集群图解

如何持久化(存储)?

  • RDB: 是对 Redis 中的数据执行周期性的持久化 (最少5分钟)

  • AOF: 对每条写入命令作为日志,以 append-only 的模式写入一个日志文件中 (可设置fsync策略),在 Redis 重启的时候,可以通过回放 AOF 日志中的写入指令来重新构建整个数据集。

    来源

如何访问/寻址?

1.4 项目实战

  • 开放服务

  • PK在线

    … …

2.安装

参照菜鸟教程

docker run -d -p 6379:6379 --name redis -v /usr/meizhangzheng/redis/data:/data  meizhangzheng/redis:6.0.9 --appendonly yes

-- mkdir -p /usr/meizhangzheng/redis/conf

-- mkdir -p /usr/meizhangzheng/redis/data

-- wget https://github.com/redis/redis/blob/6.0.9/redis.conf

docker run -d --privileged=true -p 6379:6379 --restart always -v /usr/meizhangzheng/redis/conf/redis.conf:/etc/redis/redis.conf -v /usr/meizhangzheng/redis/data:/data --name redis meizhangzheng/redis:6.0.9 redis-server /etc/redis/redis.conf --appendonly yes

3.数据结构

常见数据结构:STRING、LIST、SET、HSET、ZSET ..

4.案例分析

来源:redis 实战

4.1 文章排名

【2020-12-23】

4.1.1 获取文章详情
 	/**
     * 发表文章  (Redis in Action)
     *
     * @param conn  redis连接
     * @param user  用户key
     * @param title title key
     * @param link  link key
     * @return 文章id
     */
    public String postArticle(Jedis conn, String user, String title, String link) {
        //自增id
        String articleId = String.valueOf(conn.incr("article:"));

        //对文章投票
        String voted = "voted:" + articleId;
        conn.sadd(voted, user);
        conn.expire(voted, 7 * 86400);

        //发表文章
        long now = System.currentTimeMillis() / 1000;
        String article = "article:" + articleId;
        HashMap<String, String> articleData = new HashMap<String, String>();
        articleData.put("title", title);
        articleData.put("link", link);
        articleData.put("user", user);
        articleData.put("now", String.valueOf(now));
        articleData.put("votes", "1");
        //保存hash值
        conn.hmset(article, articleData);
        //得分排序(投票数X默认分值)
        conn.zadd("score:", now + 432, article);
        //发布时间排序
        conn.zadd("time:", now, article);

        return articleId;
    }

#结构
Hash  articleId: map

2021-09-22_redis结构之Hash

4.1.2 对文章投票
#结构
Set voted:ArticleId  userId

2021-09-22_redis结构之SET

4.1.3 发布时间排序
#结构
ZSet time:	[member]ArticleId  [score] 时间戳

2021-09-22_redis结构之ZSET

4.1.4 得分排序(投票数X默认分值)
#结构
ZSet score:	[member]ArticleId  [score] value

#返回集合信息
Set<Tuple> s = conn.zrangeWithScores("score:", 0, -1);

2021-09-22_redis结构之ZSET1

4.2 使用Redis构建WEB应用

【2020-12-25】


4.2.1 登录和cookie缓存

    4.2.1.1 Hash-token token,username 用户token信息

    4.2.1.2 ZSet-recent: {token:timestamp}最近一次登录时间

    4.2.1.3 ZSet-viewed:token,{item:timestamp} 最近浏览的一件商品

    4.2.1.4 ZSet-viewed 最近浏览的25件商品

4.2.2 使用Redis实现购物车

	4.2.2.1 Hash-cart:token item count (加入指定购物车及数量)


4.2.3 网页缓存

	4.2.3.1 缓存网页的Hash值(加解密/压缩等方式存储结果)    

4.2.4 数据行缓存

	重复调度自动刷新缓存 (具体需求具体分析)

4.2.5 网页分析

浏览商品排行榜

4.3 Redis常用命令

【2020-12-28】

    4.3.1 基础数据类型命令(STRING、LIST、SET、HASH、ZSET)

    4.3.2 订阅/发布 (SUB/PUB)

    4.3.3 其它命令( 排序、事务、键值过期)
		

4.4 数据安全与性能保障

【2021-01-05】

	4.4.1 持久化
	4.4.2 复制
	4.4.3 处理系统故障
	4.4.4 Redis事务
	4.4.5 非事务流水线
	4.4.6 性能  redis-benchmark

4.5 使用Redis构建支持程序

    4.5.1 使用Redis记录日志
    4.5.2 计数器和统计数据
    4.5.3 查找IP及所属城市、国家
    4.5.4 服务的发现与配置  (缓存配置、每分钟刷新是否维护标志)

4.6 使用Redis构建程序组件

    4.6.1 自动补全(联系人)  现在方案:客户端自己维护
    4.6.2 分布式锁
    4.6.3 计数信号量
    4.6.4 任务队列
    4.6.5 消息拉取
    4.6.6 使用Redis进行文件分发

4.7基于搜索的应用

    4.7.1 使用Redis进行搜索
    4.7.2 有序索引
    4.7.3 广告定位
    4.7.4 职位搜索

4.8 构建简单的社交网站

    4.8.1 用户和状态
    4.8.2 主页时间线
    4.8.3 关注者列表和正在关注列表
    4.8.4 状态消息的发布与删除
    4.8.5 流API 

4.9 降低内存占用

    4.9.1 短结构
    4.9.2 分片结构
    4.9.3 打包存储二进制和字节

4.10 扩展Redis

    4.10.1 扩展度性能(只读、多副本)
    4.10.2 扩展写性能和内存容量
    4.10.3 扩展复查的查询

4.11 Redis 的Lua脚本编程

    4.11.1 在不编写C代码的情况下添加新功能
    4.11.2 使用Lua重写锁和信号量
    4.11.3 移除WATCH/MULTI/EXEC事务
    4.11.4 使用Lua对列表进行分片

5.常用工具

		【2020-12-29】

		1.性能测试工具 (需要排除对命令回复时长等,一般是输出结果的50 ~60%)

		redis-benchmark 

6.问题总结

允许远程访问redis


# 默认只能本机连接
bind 0.0.0.0

# 设置后台运行
daemonize yes

requirepass 123456


# 启动服务的同时读取最新的配置文件(注意目录、运行环境)

 ./redis-server ../redis.conf

参考

菜鸟教程

springboot-redis 使用

redis 实战

dockerlearn

REDIS缓存穿透,缓存击穿,缓存雪崩原因+解决方案


欢迎拍砖,多多交流,转载请注明出处:[没长正的技术专栏](http://blog.meizhangzheng.com) 如涉及侵权问题,请发送邮件到xsj34567@163.com,如情况属实本人将会尽快删除。


上一篇 MySQL常见问题

下一篇 Redis数据类型

Comments

Content