相关问题,并发量高时如果每次都请求数据库操

2020-01-04 22:40栏目:美高梅网上游戏
TAG:

redis适合什么场景?

redis简介

Redis 是什么

  • Redis 是一个基于 key - value 的高性能非关系型数据库,类似的还有 Memcached ,Redis 整个数据库是在内存中进行操作,定期通过异步操作把数据 flush 到硬盘上。因为是纯内存操作,性能非常出色,每秒可以处理超过 10 万次读写操作。此外 Redis 还支持事务
  • Redis 支持多种数据结构,单个 value 最大限制是 1GB,不像 Memcached 只能保存 1MB 数据,可以用他的 List 来做 FIFO(先进先出)的 双向链表,实现高性能队列服务
  • Redis 的缺点主要是容易受到物理内存的限制,不能做海量数据的高性能读写

1、缓存

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写。官方提供的数据是可以达到100000+的qps

Redis 使用案例

  1. 比如 A 网站首页一天有 100 万人访问,其中有一个板块为推荐新闻。要是直接从数据库查询,那么一天就要多消耗 100 万次数据库请求。使用 Redis 可以将这种热点数据存到 Redis(内存)中,要用的时候直接从内存取,极大的提高了速度和节约了服务器的开销
  2. Redis 也可用于消息队列,通过 List 类型来做 FIFO(先进先出),满足实时的高并发需求。而通常在一个电商类型的数据处理过程之中,有关商品,热销,推荐排序的队列,通常存放在 Redis 之中
  3. 可以使用 Redis 来做计数器,对于网站的用户其个人的粉丝数等统计,如果每次请求用户主页都要从数据库中去统计其粉丝数,则会非常影响请求速度,可以将用户的粉丝计数保存在 Redis 里面,要用的时候直接从内存取,极大的提高了速度和节约了服务器的开销

缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。

单线程优点

Redis 安装与操作

关于 Redis 更详细的操作,可查看菜鸟教程上的 Redis 教程:http://www.runoob.com/redis/redis-tutorial.html

  • 因本机是 Mac 系统,所以我使用 Homebrew 安装,Window 下安装直接解压缩包即可
homebrew install redis
  • 运行下面命令启动 redis-server,可指定使用的配置文件,若省略则会启动默认的
redis-server redis.windows.conf 
  • 打开另一个终端窗口,启动一个 redis-client 连接到 redis-server
redis-cli.exe -h 127.0.0.1 -p 6379
  • 设置键值对与取出键值对
set myKey abc
get myKey

2、排行榜

代码更清晰,处理逻辑更简单

Redis 数据类型描述

很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类构能实现各种复杂的排行榜应用。

不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗

string(字符串)

  • 美高梅网上游戏,String 是最常用的一种数据类型,一个键最大可以存储 512M 大小的数据
  • 使用场景:常规的 key-value 缓存应用,常规计数:微博数、粉丝数

3、计数器

不存在多进程或者多线程导致的切换而消耗CPU

hash(哈希)

  • 每个 hash 可以存储 2 的 32 次方 -1 个 key-value,hash 特别适合用于存储对象

  • 使用场景:存储用户信息的等

    • 比如我们要存储一个用户信息对象数据,用户 ID 为查找的 Key,存储的 value 用户对象包含姓名、年龄、生日,如果用普通的 key-value 结构来存储,则为:

    美高梅网上游戏 1

    image

    • 上面方式将用户 ID 作为查找 key,把其它信息封装成一个对象以序列化方式存储,这种方式的缺点是增加了序列化的开销,并且再需要其中某一项信息时需要把整个对象取回,在修改时需要对并发进行保护。下面方式使用用户 ID + 对应属性名称作为唯一标识,省去了序列化开销和并发的问题,但用户 ID 为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的

    美高梅网上游戏 2

    image

    • 而 Redis 提供的 hash 很好的解决了这个问题,Key 仍然是用户 ID,value 是一个 Map,这个 Map 的 key 是成员的属性名,value 是属性值。也就是通过 key (用户ID) + field (属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题

    美高梅网上游戏 3

    image

什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。

redis线程是安全的

list(列表)

  • 最多可以存储 2 的 32 次方 -1 个元素,按照插入顺序排序,可以将对象添加到头部或尾部
  • 使用场景:消息队列
    • list 的使用场景很多,例如 twitter 的关注列表,粉丝列表都可以使用 Redis 的 list 来实现缓存
    • list 的另一个应用就是消息队列,可将任务存在 list 中,然后工作线程再用 pop 操作将任务取出进行执行,使用 sorted set 甚至可以构成有优先级的队列系统

4、分布式会话

单线程缺点

set(集合)

  • 集合最大成员数量为 2 的 32 次方 -1
  • 使用场景:共同关注、共同喜好、共同好友等功能
    • 与 list 功能类似,但不同之处在于 set 是可以自动重排的,当你需要一个列表数据,又不希望出现重复数据时 set 是一个很好的选择
    • 在微博应用中,可以将一个用户所有关注人存在一个集合中,将其所有粉丝存在一个集合中,通过 Redis 为 set 提供的交集、并集、差集等操作可以非常方便的实现如:共同关注、共同喜好、共同好友等功能

集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。

无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善

sorted set(有序集合)

  • zset 与 set 一样,不同的是每个元素都会关联一个 double 类型的分数,redis 通过分数来为集合中的成员进行排序
  • 使用场景:按时间、分数等排序集合列表,权重队列等
    • 它与 set 的区别是,set 不是自动有序的,而 sorted set 可以可以通过提供一个优先级(score)的参数来为成员排序,并且插入是有序的,即自动排序
    • 当你需要一个有序且不重复的集合列表时可以选择 sorted set 数据结构,比如按时间排序集合列表

5、分布式锁

redis应用场景

HyperLogLog

  • HyperLogLog 是用来做计算统计算法,它只需花费 12kb 内存就可以计算 2 的 64 次方不同的数据
  • 基数为不重复的数值,如数据集 {1,3,5,5} 的基数为 {1,3,5} 3个

在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。

令牌(Token)生成

Redis 事务

  • Redis 事务可以一次执行多个命令:
    • 批量操作在发送 EXEC 命令前被放入队列缓存
    • 收到 EXEC 命令之后会进入事务执行,执行中任意命令失败,其余的命令依然被执行
    • 事务执行过程,其它客户端提交的命令请求不会插入到事务执行命令序列中
  • 一个事务从开始到执行会经历以下三个阶段:
    • 开始事务
    • 命令入队
    • 执行事务
  • 比如下面命令,如果 set b bbb 处失败,set a 已经成功不会回滚,set c 还会继续执行
redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK
  • Redis 事务可以保证单个客户端的多个操作都是原子性的

版权声明:本文由美高梅开户送58元官网发布于美高梅网上游戏,转载请注明出处:相关问题,并发量高时如果每次都请求数据库操