redis取经之路
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取经之路的更多相关文章
- redis成长之路——(二)
redis操作封装 针对这些常用结构,StackExchange.Redis已经做了一些封装,不过在实际应用场景中还必须添加一些功能,例如重试等 所以对一些常功能做了一些自行封装SERedisOper ...
- redis成长之路——(一)
为什么使用redis Redis适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就 ...
- redis成长之路——(七)
扩展性封装 虽说现在StackExchange.Redis免费,万一到时候和servicestack.redis一样要收费呢,所以先留一口,后续的可以再处理 实例代码点击这里查看 redis成长之路- ...
- redis成长之路——(六)
redis配置 为了码农在代码上只关心业务以及代码上的统一性,wenli.drive.redis内部使用配置来完成那些不同的场景,也就是说随便填填配置就能适应不同的场景! 当然配置多了码农也会受不了, ...
- redis成长之路——(五)
单例.哨兵.Cluster redis应用广泛,主要体现于实际场景的可用化,但是对于码农来说初步入手很多理念难以理解:码农的想法就是:为什么我要管那么多,我只想用,能用就行!所以必须将三个场景透明化. ...
- redis成长之路——(三)
redis连接封装 StackExchange.Redis中有一些常功能是不在database对中,例如发布订阅.获取全部key(本代码中已封装到operation中了)等,而且StackExchan ...
- redis成长之路——(四)
加强redis连接的连接池 虽然StackExchange.Redis针对连接已经做了很多工作,不过在实际应用场景中还是不够的,比如多实例的vip就会导致只能连到其中一个实例上等:本实例中的连接池只能 ...
- Redis——学习之路四(初识主从配置)
首先我们配置一台master服务器,两台slave服务器.master服务器配置就是默认配置 端口为6379,添加就一个密码CeshiPassword,然后启动master服务器. 两台slave服务 ...
- Redis——学习之路三(初识redis config配置)
我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息. ...
随机推荐
- C++ volatile关键字(转)
文章来源: http://hedengcheng.com/?p=725 https://www.cnblogs.com/god-of-death/p/7852394.html 1.基本概念 volat ...
- [Luogu] P3225 [HNOI2012]矿场搭建
题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之 ...
- ConcurrentHashMap笔记
概览: 内部存储的数据结构为:数组+链表+红黑树,图示: 重要的属性(内部类): //存放元素的数组 transient volatile Node<K,V>[] table; //数组中 ...
- Python生成随机不重复姓名昵称
姓采用百家姓,名字从常用名字高频字选取两个汉字,再和当前时间戳组合,估计应该是不会重复了,代码如下: # -*- coding:utf-8 -*- import random import time ...
- BZOJ 1666 USACO 2006 Oct. 奶牛的数字游戏
直接模拟2333 #include<cstdio> #include<algorithm> using namespace std; int n,ans; void read( ...
- 【10】AngularJS SQL
AngularJS SQL 使用 PHP 从 MySQL 中获取数据 <div ng-app="myApp" ng-controller="customersCtr ...
- 【Codeforces 501C】Misha and Forest
[链接] 我是链接,点我呀:) [题意] 给你一棵树 但是每个节点只告诉你出度个数 以及所有和它相连的点的异或和. 让你还原这棵树 [题解] 叶子节点的话,他所有节点的异或和就是它那唯一的一个爸爸 因 ...
- 戏说云计算之PaaS,IaaS,SaaS
最近我们聊到"CRM系统PAAS化",有些可能就不了解,到底什么是PAAS.云计算还有IaaS,SaaS概念,这三者之间有什么区别?今天智云通CRM系统小编用通俗易懂的例子跟大家分 ...
- hdu 1867 kmp匹配
#include<stdio.h> #include<string.h> #define N 100100 void getnext(int next[],char s[]) ...
- 放大的X
Problem Description 请你编程画一个放大的’X’.如3*3的’X’应如下所示: X X XX X 5*5的’X’如下所示:X X X X X X XX X Input 输入数据第 ...