redis基本数据结构

Redis使用的是自己构建的简单动态字符串(SDS)[simple dynamic string,SDS]的抽象类型,并将SDS用做Rdis的默认字符串表示

redis> SET msg "hello"
Ok

redis的Key-Value的存储方式

key是一个字符串对象,对象的底层实现是一个保存着字符串"msg"的SDS
value也是一个字符串对象,对象的底层实现是一个保存着字符串"hello"的SDS

SDS除了用来保存数据库中的字符串值之外,还被用作缓冲区(Buffer):AOF模块中的AOF缓冲区

基本数据类型

- 字符串命令:GET SET DEL

- 列表:一个列表结构可以有序地存储多个字符串

     LPUSH RPUSH 表示元素推入列表的左端和右端
LPOP RPOP分别从列表的左端和右端弹出元素,被弹出的元素不再属于列表
LINDEX用于获取列表在给定位置的上一个元素
LRANGE用于获取列表在给定范围上的所有元素 - 集合:列表可以存储多个相同的字符串,集合则通过散列表来保证自己存储的每个字符串都是各不相同的(这些散列表只有键,但没有与键相关联的值)
redis的集合使用的是无序方式存储元素 SADD:将元素添加到集合 redis> sadd fengjr "hehehehe"
(integer) 1 SREM:从集合移除元素,命令会返回被移除元素的数量
SMEMBERS:获取集合包含的所有元素将得到一个由元素组成的序列
SISMEMBER:快速检查一个元素是否已经存在于集合中 - 散列:redis的散列可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以是字符串,又可以是数字值,并且用户同样可以对散列存储的数字值执行自增操作或者自减操作 HSET:在散列里面关联起给定的键值对 hset hash-key sub-key1 value1
hset hash-key sub-key2 value2
栗子:
redis> HSET myhash field1 123
redis> HSET myhash name liangym 返回值为1表示给定的键不存在于散列里面,添加成功
返回值为0表示给定的键存在于散列里面,添加失败 HDEL:如果给定键存在于散列里面,删除这个键
栗子:
redis> HDEL myhash name
(integer) 1 删除成功 HGET:从散列里面获取某个键的值 HGETALL:获取散列包含的所有键值对
栗子:
redis> HGETALL myhash
1) "filed1"
2) "foo"
3) "field1"
4) "123" HINCRBY:对散列存储的值执行自增操作 HINCRBY key field icrement
栗子:
redis>HINCRBY myhash field1 123
(integer) 246 - 有序集合:和散列一样都用于存储键值对:有序集合的键被称为成员(member),每个成员都是各不相同的;而有序集合的值则被称为分值(score),分值必须为浮点数 ZADD:将一个带有给定分值的成员添加到有序集合里面
栗子:
redis>zadd zset-key 728 member ZRANGE:根据元素在有序排列中所处的位置,从有序集合里面获取多个元素
ZRANGEBYSCORE:获取有序集合在给定分值范围内的所有元素
ZREM:如果给定成员存在于有序集合,那么移除这个成员
ZINCRBY:给有序集合成员的分值执行自增操作
栗子:
ZINCRBY key increment member
redis>ZINCRBY zset-key 123 member1 ZSCORE:检查记录的有序集合的值
栗子:
ZSCORE key member
redis>ZSCORE zset-key member1
"851"

redis的特性

  数据结构
内存存储(这使得Redis的速度非常快)
远程(这使得Redis可以与多个客户端和服务器进行连接)
持久化(这可以使得服务器可以再重启之后仍然保持重启之前的数据)
可扩展(通过主从复制和分片) 通过将传统数据库的一部分数据处理任务以及存储任务转交给redis来完成,可以提升网页的载入速度,并降低资源的占用量

场景一:登录和cookie缓存

  将登录信息存储在cookie中  可以用签名(signed) 和令牌(token)
使用redis来记录用户信息,将每天要对数据库执行的写入操作减少了很多

场景二:购物车

  定义:
散列:每个用户的购物车
key:商品ID
value:商品订购数量 将会话和购物车都存储到Redis里面,这样可以减少请求的体积,还可以使得我们根据用户浏览过的上铺,用户放入购物车的商品,以及用户最终购买的商品进行统计计算。
实现:在查看过这件商品的用户当中,有X%的用户最终购买了这件商品, 购买了这件商品的用户也购买了某某某其他商品 等功能

网页缓存

  页面内容不需要动态生成,减少网站在动态生成内容上面所花的时间,可以降低网站处理相同负载所需的服务器数量,并让网站的速度变得更快(增强用户体验)

  中间层的作用:对于一个不能被缓存的请求,函数将直接生成并返回页面,而对于可以被缓存的请求,函数首先会尝试从缓存里取出并返回被缓存的页面,如果缓存页面不存在,那么函数会生成页面并将其缓存在Redis中5分钟,最后将页面返回给函数调用者

数据行缓存

  场景:促销活动,会推出一些特价商品供用户抢购
疑虑:网站如果对整个促销页面进行缓存,可能会导致用户看到错误的特价商品的数量,但如果每次都从数据库里面取出特价商品的剩余数量的话又会给数据库带来巨大的压力,导致我们需要花费额外的成本来扩展数据库。
解决:促销活动必定会带来一些负载,所以必须对数据进行缓存,编写一个持续运行的守护进程,让这个函数将指定的数据行缓存到redis里面,并不定期地对这些缓存进行更新。 设置两个有序集合,分别为:调度有序集合,延时有序集合,调度顾名思义调度,延时则是设置了指定数据航的缓存需要每隔多少秒更新一次
如果数据行记录的是特价促销商品的剩余数量,并且参与促销活动的用户非常多的话,那么我们最好每隔几秒更新一次数据行缓存;另一方面,如果数据并不经常改变,或者商品缺货是可以接受的,那么我们可以将更新缓存的时间变长

redis取经之路的更多相关文章

  1. redis成长之路——(二)

    redis操作封装 针对这些常用结构,StackExchange.Redis已经做了一些封装,不过在实际应用场景中还必须添加一些功能,例如重试等 所以对一些常功能做了一些自行封装SERedisOper ...

  2. redis成长之路——(一)

    为什么使用redis Redis适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就 ...

  3. redis成长之路——(七)

    扩展性封装 虽说现在StackExchange.Redis免费,万一到时候和servicestack.redis一样要收费呢,所以先留一口,后续的可以再处理 实例代码点击这里查看 redis成长之路- ...

  4. redis成长之路——(六)

    redis配置 为了码农在代码上只关心业务以及代码上的统一性,wenli.drive.redis内部使用配置来完成那些不同的场景,也就是说随便填填配置就能适应不同的场景! 当然配置多了码农也会受不了, ...

  5. redis成长之路——(五)

    单例.哨兵.Cluster redis应用广泛,主要体现于实际场景的可用化,但是对于码农来说初步入手很多理念难以理解:码农的想法就是:为什么我要管那么多,我只想用,能用就行!所以必须将三个场景透明化. ...

  6. redis成长之路——(三)

    redis连接封装 StackExchange.Redis中有一些常功能是不在database对中,例如发布订阅.获取全部key(本代码中已封装到operation中了)等,而且StackExchan ...

  7. redis成长之路——(四)

    加强redis连接的连接池 虽然StackExchange.Redis针对连接已经做了很多工作,不过在实际应用场景中还是不够的,比如多实例的vip就会导致只能连到其中一个实例上等:本实例中的连接池只能 ...

  8. Redis——学习之路四(初识主从配置)

    首先我们配置一台master服务器,两台slave服务器.master服务器配置就是默认配置 端口为6379,添加就一个密码CeshiPassword,然后启动master服务器. 两台slave服务 ...

  9. Redis——学习之路三(初识redis config配置)

    我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息.     ...

随机推荐

  1. Gym - 101670F Shooting Gallery(CTU Open Contest 2017 区间dp)

    题目&题意:(有点难读...) 给出一个数字序列,找出一个区间,当删除这个区间中的两个相同的数字后,只保留这两个数字之间的序列,然后继续删除相同的数字,问最多可以实行多少次删除操作. 例如: ...

  2. Dollar Dayz POJ - 3181

    解法 完全背包+大数...不想写大数了放个python得了 代码 dp=[0 for i in range(2000)] n,k=map(int,input().split()) num=[i for ...

  3. 利用stylist插件,简单两步屏蔽新浪微博上的广告

    以前新浪微博只是在侧栏有几块小小的广告,还算可以接受,想着忍忍就算了,可最近真是越来越不厚道了,自从和淘宝合作之后,侧栏就开始有一大块广告根据你在淘宝的搜索记录推荐商品,更可恶的是信息流里的祛痘微博现 ...

  4. 热词解析(9) — hangry

    今天给大家介绍一个非常有趣.又超级实用的词!!中文叫"饿极而怒",英文叫... 不知道你有没有这样的经历,当你饿着肚子等着你妈做饭,结果你妈却在麻将桌上不下来,你就越来越饿,越饿越 ...

  5. 匹配 C 语言样式字符串

    #include <stdio.h> char haha[] = "nihaoma" "niubi" "\"hello worl ...

  6. codechef营养题 第三弹

    第三弾が始まる! codechef problems 第三弹 一.Motorbike Racing 题面 It's time for the annual exciting Motorbike Rac ...

  7. SCOI2010第一场

    NOI2010全国青少年信息学奥林匹克竞赛 四川代表队选拔赛 第一场 题目名称 幸运数字 游戏 股票交易 英文代号 luckynumber game trade 时限 2秒 2秒 2秒 输入文件 lu ...

  8. 利用python进行数据分析--(阅读笔记一)

    以此记录阅读和学习<利用Python进行数据分析>这本书中的觉得重要的点! 第一章:准备工作 1.一组新闻文章可以被处理为一张词频表,这张词频表可以用于情感分析. 2.大多数软件是由两部分 ...

  9. C. Painting Fence 分治

    memory limit per test 512 megabytes input standard input output standard output Bizon the Champion i ...

  10. 单例模式解决RabbitMQ超出最大连接问题

    今天在项目稳定性测试过程中遇到一个情景:通过工具jMeter一直请求消息转发服务器,消息转发服务器再向rabbitMQ发送数据,在这期间出现了问题.MQ意外宕机. 1. 查看rabbitMQ管理界面. ...