1.文章详情页面静态化方案

    1. 1.基于数据库查询方案
    2. 用户某一条文章,根据文章的id去查询文章内容表,返回渲染页面
    3. 优点:
    4. * 实现简单
    5. * 保证数据强一致性
    6. 缺点:
    7. * 无法支撑高并发
    8. 2.页面静态化方案
    9. 优点:
    10. * 支撑高并发,高可用
    11. * 页面响应快,用户体验好
    12. 缺点:
    13. * 强一致性较弱,但能够保证最终一致性

    2.freemarker介绍

    1. FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据,
    2. 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。
    3. 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
    4. 模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言,
    5. 不是像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,
    6. 比如数据库查询和业务运算, 之后模板显示已经准备好的数据。
    7. 在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。

    3.基于redis实现用户关注和取关功能

    1. 一个用户关注了作者,作者是由用户实名认证以后开通的作者权限,才有了作者信息,
    2. 作者肯定是app中的一个用户。
    3. 从用户的角度出发:一个用户可以关注其他多个作者 —— 我的关注
    4. 从作者的角度出发:一个用户(同是作者)也可以拥有很多个粉丝 —— 我的粉丝

    4.redis常见数据结构
    image.png
    5.redis持久化机制

    1. 持久化是有两种方式的。
    2. 1RDBRDB 持久化机制,是对 Redis 中的数据执行周期性的持久化。
    3. 2AOFAOF 机制对每条写入命令作为日志,以 append-only 的模式写入一个日志文件中,因为这个模式是只追加的方式,所以没有任何磁盘寻址的开销,所以很快,有点像Mysql中的binlog
    4. 两种方式都可以把Redis内存中的数据持久化到磁盘上,然后再将这些数据备份到别的地方去,RDB更适合做冷备,AOF更适合做热备.
    5. tip:两种机制全部开启的时候,Redis在重启的时候会默认使用AOF去重新构建数据,因为AOF的数据是比RDB更完整的。

    6.redis事务机制

    1. MULTIEXECDISCARD WATCH 命令是 Redis 实现事务的的基础。
    2. Redis 事务的执行过程包含三个步骤:
    3. 开启事务;
    4. 命令入队;
    5. 执行事务或丢弃;
    6. 显式开启一个事务
    7. 客户端通过 MULTI 命令显式地表示开启一个事务,随后的命令将排队缓存,并不会实际执行。
    8. 命令入队
    9. 客户端把事务中的要执行的一系列指令发送到服务端。
    10. 需要注意的是,虽然指令发送到服务端,但是 Redis 实例只是把这一系列指令暂存在一个命令队列中,并不会立刻执行。
    11. 执行事务或丢弃
    12. 客户端向服务端发送提交或者丢弃事务的命令,让 Redis 执行第二步中发送的具体指令或者清空队列命令,放弃执行。
    13. Redis 只需在调用 EXEC 时,即可安排队列命令执行。
    14. 也可通过 DISCARD 丢弃第二步中保存在队列中的命令。
    15. 正常执行
    16. 通过 MULTI EXEC 执行一个事务过程:
    17. ## 开启事务
    18. > MULTI
    19. OK
    20. ## 开始定义一些列指令
    21. > SET “公众号:码猿技术专栏” "粉丝 100 万"
    22. QUEUED
    23. > SET "order" "30"
    24. QUEUED
    25. > SET "文章数" 666
    26. QUEUED
    27. > GET "文章数"
    28. QUEUED
    29. ## 实际执行事务
    30. > EXEC
    31. 1) OK
    32. 2) OK
    33. 3) OK
    34. 4) "666"
    35. 我们看到每个读写指令执行后的返回结果都是 QUEUED,表示谢谢操作都被暂存到了命令队列,还没有实际执行。
    36. 当执行了 EXEC 命令,就可以看到具体每个指令的响应数据。
    37. 放弃事务
    38. 通过 MULTI DISCARD丢弃队列命令:
    39. ## 初始化订单数
    40. > SET "order:mobile" 100
    41. OK
    42. ## 开启事务
    43. > MULTI
    44. OK
    45. ## 订单 - 1
    46. > DECR "order:mobile"
    47. QUEUED
    48. ## 丢弃丢列命令
    49. > DISCARD
    50. OK
    51. ## 数据没有被修改
    52. > GET "order:mobile"
    53. "100"

    7.redis项目中应用场景

    1. 用于保存关注作者的信息 以及作者的粉丝信息

    8.redis的高可用架构 主从 哨兵 集群

    9.redis中 key过期删除策略

    1. redis实际使用的过期键删除策略是定期删除策略和惰性删除策略:
    2. redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key。除了定时遍历之外,它还会使用惰性策略来删除过期的 key,所谓惰性策略就是在客户端访问这个 key 的时候,redis key 的过期时间进行检查,如果过期了就立即删除。定时删除是集中处理,惰性删除是零散处理。
    3. 通过配合使用这两种删除策略,服务器可以很好地合理使用cpu时间和避免浪费内存空间之间取得平衡。

    10.redis中 内存淘汰策略

    1. 长期将Redis作为缓存使用,难免会遇到内存空间存储瓶颈,当Redis内存超出物理内存限制时,内存数据就会与磁盘产生频繁交换,使Redis性能急剧下降。此时如何淘汰无用数据释放空间,存储新数据就变得尤为重要了。
    2. LRULeast Recently Used)最近最少使用的key予以淘汰,是Redis唯一支持的回收方法
    3. Maxmemory配置指令
    4. maxmemory配置指令用于配置Redis存储数据时指定限制的内存大小。
    5. 设置maxmemory0代表没有内存限制。对于64位的系统这是个默认值,对于32位的系统默认内存限制为3GB
    6. 当指定的内存限制大小达到时,需要选择不同的行为,也就是策略。 Redis可以仅仅对命令返回错误,这将使得内存被使用得更多,或者回收一些旧的数据来使得添加数据时可以避免内存限制。
    7. 回收策略
    8. maxmemory限制达到的时候Redis会使用的行为由 Redismaxmemory-policy配置指令来进行配置。
    9. 以下的策略是可用的:
    10. noeviction:是Redis默认内存回收策略,返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
    11. allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
    12. volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
    13. allkeys-random: 回收随机的键使得新添加的数据有空间存放。
    14. volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
    15. volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。