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. Fleecing the Raffle(NCPC 2016 暴力求解)

    题目: A tremendously exciting raffle is being held, with some tremendously exciting prizes being given ...

  2. 【汇总】java中数组的声明、初始化及遍历

    java中数组用来存储固定大小的同类型元素 一维数组: 1.数组的声明: //声明一维数组,推荐用第一种 int[] a; int b[]; 2.数据的初始化:有三种初始化方式 (1).静态初始化 / ...

  3. java 十五周总结

  4. Python3.0科学计算学习之类

    类: Python中的类是一个抽象的概念,甚至比函数还要抽象.可以把它简单的看作是数据以及由存取.操作这些数据的方法所组成的一个集合.类是Python的核心概念,是面向对象编程的基础. 类有如下的优点 ...

  5. Python学习——字典

    字典 字典是另一种可变容器模型,且可存储任意类型对象. 1.创建字典 字典由键和对应值成对组成.每个键与值之间用:隔开,每对之间逗号隔开. 每个键应当互不相同,值可以相同.若同时出现两个相同的键,则后 ...

  6. c# 缓存!

    做项目的时候获取所有城市的时候,发现每次去获取都花费了很多时间,所以用缓存方法让效率更高! 这是我做的例子,如下: public class CacheGetCity { /// <summar ...

  7. [bzoj1001]狼爪兔子[平面图的最小割等于其对偶图的最短路]

    一定要仔细算内存,,,又少写一个零.. #include <bits/stdc++.h> using namespace std; template<const int _n,con ...

  8. vim下多行注释与解注释

    1.多行注释 (1)按esc进入命令行模式 (2)按下Ctrl+v,进入区块模式,并使用上下键选择需要注释的多行 (3)按下“I”(大写)键,进入插入模式 (4)输入注释符(“//”或“#”等) (5 ...

  9. hdu3450

    分析:首先要知道有递推公式dp[i] = Sigma(dp[j]),dp[i]表示第i个数结尾的完美子序列的个数,|a[i] - a[j]| <= d,j<i.直接这样做的时间复杂度为n^ ...

  10. 放大的X

    Problem Description 请你编程画一个放大的’X’.如3*3的’X’应如下所示: X X XX X 5*5的’X’如下所示:X X X X X X XX X   Input 输入数据第 ...