zoukankan      html  css  js  c++  java
  • redis总结

     

    redis与memcached

    • redis支持更多的数据结构
    • redis支持数据持久化

    redis支持两种存储方式:snapshot(快照)和aof(append only mode),快照是定时将内存快照持久化到硬盘(crash会丢失数据),aof是在写入数据的同时将操作命令保存到日志(不会丢失数据,但操作日志管理维护成本高)

    • redis单线程,memcached是多线程的
    • redis修改libevent实现小巧的epoll,memcached完全依赖libevent(性能影响)
    • memcached使用CAS避免资源竞争修改,redis提供了事务功能

    CAS是通过为每一个cacke key设置一个隐藏的cas token作为版本号,每次set操作都会检查并更新token

    数据类型

    string

    string是key/value的存储结构(同memcached一样),支持的命令:

    get/set/del
    incr/incrby
    decr/descby
    append/strlen
    getrange/setrange

    问题:计数

    一般情况都需要额外使用锁来避免并发写的问题。

    解决方法:

    使用incr命令来实现原子递增,使用get/set来重置计数状态。

    与memcached相同,可作为key/value数据库,例如session共享。

    hash

    hash的value实际上是一个hashmap,可以直接操作value的各个feild的值,支持的命令:

    hset/hget/hgetall
    hmset/hmget
    hlen/hexists
    hkeys/hvals

    hash两种实现方式,

    • 当数据较少时,为了节省内存采用线性存储来节省空间
    • 当数据较多时,才会使用hashmap来降低时间复杂度

    问题:商品维度计数 商品有各种计数(喜欢、评论、鉴定、浏览等) 解决方法: 使用hashfield字段来存储喜欢、评论等计数值。

    同理,用户维度计数(动态、关注、粉丝、喜欢、发帖等)。

    该存储结构适用于常用的商品、热门新闻动态等经常被大量访问的数据对象。

    list

    list通过双向链表实现,支持反向查找和遍历,支持的命令:

    lpush/rpush
    lpop/rpop
    lrange/lrem

    利用pushpop操作可以实现消息队列,也可以实现关注列表、粉丝/在线好友列表等功能。

    问题:显示最新的项目列表

    SELECT * FROM foo WHERE ... ORDER BY TIME DESC LIMIT 10;

    数据库上的查询语句如上,随着数据的增多,排序会越来越慢。 解决方法:

    • 为每一条数据选择一个唯一的ID(可选自增ID)
    • 缓存最新的N个数据,利用redis做数据缓存(list结构不断LPUSH最新的数据)
    • 当查询内容超过redis缓存内容后,才会穿透缓存访问数据库

    消息队列的实现:

    • list数据结构作为channel
    • 生产者lpush消息
    • 消费者rpop消息
    • 设定超时时间

    上述消息队列与PUB/SUB相比,不会丢失数据,但也没有失败重传的机制(也就是没有消息状态)

    set

    set是一个不允许重复的数据组合,支持的命令:

    sadd/spop
    sismembers
    sinter/sunion/sdiff

    smembers可以用来实现好友列表中判断是否为已存在好友或关注好友,也可以通过集合操作来实现共同好友、共同兴趣、共同关注列表等。

    问题:判断微博的共同好友、共同兴趣、是否为关注好友 解决方法:

    • 利用set集合存储用户的好友ID
    • 通过sismembers判断用户是否存在好友集合中
    • 通过sinter来判断两个好友集合的共同好友
    • 通过sunion来获取两个集合的所有好友
    • 通过sdiff来获取两个集合的非共同好友,用于好友推荐

    sorted set

    sorted set是有序的set,通过提供一个优先级score来实现自动排序,支持的命令:

    zadd/zrem
    zrange/zcard

    score可以用来实现权重队列,也可以实现按时间、评分的自动排序列表。

    问题:在线游戏实时排行榜 在线游戏的排行榜都需要实时更新操作,不可能去频繁地更改关系型数据库, 解决方法:

    • 为用户设置唯一的ID,采用sorted set来存储用户的得分情况
    • 利用有序集合来对用户得分进行排名,这里不可能存储全部的用户,可能只关心前100个用户,那么就需要在redis之外做限制

    问题:新闻排序 新闻排序是按照新闻的关注度(点击率)和时间做排序,

    score = points / (time^alpha)

    上面的公式可以说明,点击率越高,越可能获得更多的评分;时间越久远,也会降低新闻的评分。 因此,需要有一个专门用于计算新闻评分的进程,实时地处理最新的N条数据 解决方法:

    • 拉取最新的N条数据
    • 计算各个数据的评分
    • 添加到有序集合中

    Pub/Sub

    实现消息队列、实时消息系统。

    Transactions

    redis提供事务的支持,

    • 事务可以一次执行多个命令,多个命令按照顺序执行,不会被其他客户单的命令所打断
    • 事务是原子操作,要么全部执行,要么不执行

    使用方法:

    > MULTI
    > ...
    > EXEC

    错误处理:

    • 在EXEC之前产生的错误,redis会自动放弃这个事务
    • 在EXEC之后产生的错误,并没有特殊处理

    其他应用

    • 实时统计,而全量操作数据记录到log日志,利用Hadoop进行更全面的离线分析
    • web缓存,减轻数据库压力
  • 相关阅读:
    (续)在深度计算框架MindSpore中如何对不持续的计算进行处理——对数据集进行一定epoch数量的训练后,进行其他工作处理,再返回来接着进行一定epoch数量的训练——单步计算
    YAML文件简介
    训练集验证集测试集的概念
    泛化误差
    drawio的打开方法
    移动硬盘无法被电脑识别
    r5 3600相当于英特尔什么级别
    Ubuntu WPS字体缺失配置
    pytorch深度学习cpu占用太高
    常用的架构设计原则-云原生架构设计快速入门
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/8983915.html
Copyright © 2011-2022 走看看