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. Maven_在Eclipse中执行Maven命令

  2. RequestMapping_请求方式

    [映射请求参数.请求方法或请求头] 1.@RequestMapping 除了可以使用请求URL 映射请求外,还可以使用请求方法.请求参数及请求头映射请求. 2.@RequestMapping 的val ...

  3. reids桌面管理工具:RedisDesktopManager下载、使用

    概要:一款好用的Redis桌面管理工具,支持命令控制台操作,以及常用,查询key,rename,delete等操作. 下载软件,请点击下面链接,进入下载页,选择对应版本: https://redisd ...

  4. 工资(money)

    (money/money.in/money.out) 时限1000ms 内存256MB 聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi.有m个结算工钱的时间,聪哥可以自由 ...

  5. Asp.Net页面生命周期[转]

    一.什么是Asp.Net页面生命周期 当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面,  完全识别 HTTP 页 ...

  6. Mysql修改自增主键的起始值及查询自增主键的下一个值

    MySQL [xxx_mall]> alter table shop_base_info  AUTO_INCREMENT=11000;Query OK, 0 rows affected (0.0 ...

  7. 1. 找出数组中的单身狗OddOccurrencesInArray Find value that occurs in odd number of elements.

    找出数组中的单身狗: 1. OddOccurrencesInArray Find value that occurs in odd number of elements. A non-empty ze ...

  8. leetcode 114.Flatten Binary Tree to Linked List (将二叉树转换链表) 解题思路和方法

    Given a binary tree, flatten it to a linked list in-place. For example, Given 1 / \ 2 5 / \ \ 3 4 6 ...

  9. hdu5396 Expression 区间dp +排列组合

    #include<stdio.h> #include<string> #include<map> #include<vector> #include&l ...

  10. NYOJ 330 一个简单的数学题【数学题】

    /* 题目大意:求解1/n; 解题思路:写一个输出小数的算法 关键点:怎样处理小数点循环输出 解题人:lingnichong 解题时间:2014-10-18 09:04:22 解题体会:输出小数的算法 ...