redis知识

NoSQL应海量用户高并发而生, 例如春运购买车票。 这种场景, 仅仅只靠关系型数据库是不行的, (redo日志, 会频繁的进行刷盘操作) , 那么其一:磁盘IO就是我们的性能瓶颈; 其二:数据关系复杂, 扩展性差, 不便于大规模集群; 即有了NoSQL...

什么是NoSQL?

NoSQL指 Not-Only SQL (泛指非关系型数据库), 作为关系型数据库的补充! 表达存储数据不仅仅可以用SQL!作用:应对基于海量用户和海量数据前提下的数据处理问题。

Redis

概念:Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。

特征:

(1)数据间没有必然的关联关系;

(2)内部采用单线程机制进行工作;

(3)高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。

(4)多数据类型支持

(5)支持持久化,可以进行数据灾难恢复

redis的应用场景

(1)为热点数据加速查询(主要场景)。如热点商品、热点新闻、热点资讯、推广类等高访问量信息等。

(2)即时信息查询。如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等。

(3)时效性信息控制。如验证码控制、投票控制等。

(4)分布式数据共享。如分布式集群架构中的 session 分离

消息队列.

数据类型 ==> 都是基于key-value  value由redisObject构建, 可存储多种value类型

1. String:

       1. 基本操作

        set key value  //  get  key  // del key  

        setnx key value   判定性添加数据

        mset key1 value1 key2 value2 …  添加/修改多个数据

        mget key1 key2 …   获取多个数据

        append key value 追加信息到原始信息后部(如果原始信息存在就追加,否则新建)       

         2. 使这个键的值自增1

        incr key            反之 :  decr key  

        incrby key increment                                      decrby key increment

        incrbyfloat key increment

        3. 设置数据具有指定的生命周期

        setex key seconds value                

        psetex key milliseconds value

string应用场景与key命名约定

它的应用场景在于:主页高频访问信息显示控制,例如新浪微博大V主页显示粉丝数与微博数量。

(1)在redis中为大V用户设定用户信息,以用户主键和属性值作为key,后台设定定时刷新策略即可。         eg:  user:id:3506728370:fans     -->  999999    user:id:3506728370:blogs   --> 6666

(2)也可以使用json格式保存数据

        eg:   user:id:3506728370    → {“fans”:12210947,“blogs”:6164,“ focuses ”:83 }

(3) key 的设置约定

数据库中的热点数据key命名惯例:  表名  + 主键名 + 主键值 + 字段名

Hash的基本操作

由于String类型存储对象的时候, 如果需要频繁的修改, 将会显得笨重! 有了和hashMap一样格式的key value存储空间。

对一系列存储的数据进行编组,方便管理,典型应用存储对象信息

hash类型:底层使用哈希表结构实现数据存储

添加数据: hset key field value

获取数据: hget key field

删除数据: hdel key field1 [field2]

设置field:     hsetnx key field value

添加、修改多个数据: hmset key field1 value1 field2 value2 …

获得多个数据: hmget key field1 field2 …

获得hash表数量: hlen key 

获取哈希表中是否存在指定的字段:   hexists key field

获取该键所有字段、 值:  hkeys key     hvals key

设置指定字段的数值数据增加指定范围的值:    hincrby (hincrbyfloat ) key field increment

eg: HSET user:01 score 1    -- HINCRBY user:01 score 10  --  结果为: 11

hash类型数据操作的注意事项:

        (1) hash类型中value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)。

        (2) 每个 hash 可以存储 232 - 1 个键值对hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计 的,切记不可滥用,更不可以将hash作为对象列表使用。

        (3) getall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈。

       

hash应用场景

双11活动日,销售手机充值卡的商家对移动、联通、电信的30元、50元、100元商品推出抢购活动,每种商品抢购上限1000  张。

1. 我们可以用商家的ID作为键

2. 以参与抢购的商品ID作为Field

3. 将参与抢购的商品数量作为对应的value

4. 抢购时使用降值的方式控制产品数量

EG:   hset product:id:002  yidong:01 1000   liantong:02 1000

list基本操作

之前的俩种存储都是不存在顺序关系的, list专门干这事儿来的。

数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分

需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序

list类型:保存多个数据,底层使用双向链表存储结构实现

添加数据: 

lpush key value1 [value2] ……

rpush key value1 [value2] ……

获取数据:

lrange key start stop

lindex key index

llen key

获取并移除数据:

lpop key

rpop key

list扩展操作:

移除指定数据:   lrem key count value

规定时间内获取并移除数据:  

blpop key1 [key2] timeout

brpop key1 [key2] timeout

brpoplpush source destination timeout

list 类型数据操作注意事项:

(1)list中保存的数据都是string类型的,数据总容量是有限的,最多232 - 1 个元素(4294967295)。

(2)list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作

(3)获取全部数据操作结束索引设置为-1

(4)list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载

list 应用场景:

企业运营过程中,系统将产生出大量的运营数据,如何保障多台服务器操作日志的统一顺序输出?

解决方案: 

        1. 依赖list的数据具有顺序的特征对信息进行管理

        2. 使用队列模型解决多路信息汇总合并的问题

        3. 使用栈模型解决最新消息的问题

set 基本操作:

        新的存储需求:存储大量的数据,在查询方面提供更高的效率

        需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询

        set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的

添加数据: sadd key member1

获取全部数据: smembers key

删除数据: srem key member1 [member2]

获取集合数据总量: scard key

判断集合中是否包含指定数据: sismember key member

随机获取集合中指定数量的数据: srandmember key [count]

随机获取集中的某个数据并将该数据移除集合: spop key [count]

set 类型数据的扩展操作:

求两个集合的交、并、差集

sinter key1 [key2 …]  

sunion key1 [key2 …]  

sdiff key1 [key2 …]

求两个集合的交、并、差集并存储到指定集合中

sinterstore destination key1 [key2 …]  

sunionstore destination key1 [key2 …]  

sdiffstore destination key1 [key2 …]

set 类型数据操作的注意事项:

set 类型不允许数据重复,如果添加的数据在 set 中已经存在,将只保留一份。

set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间。

set应用场景:

(1)黑名单

资讯类信息类网站追求高访问量,但是由于其信息的价值,往往容易被不法分子利用,通过爬虫技术,  快速获取信息,个别特种行业网站信息通过爬虫获取分析后,可以转换成商业机密进行出售。例如第三方火 车票、机票、酒店刷票代购软件,电商刷评论、刷好评。

同时爬虫带来的伪流量也会给经营者带来错觉,产生错误的决策,有效避免网站被爬虫反复爬取成为每个网站都要考虑的基本问题。在基于技术层面区分出爬虫用户后,需要将此类用户进行有效的屏蔽,这就是黑名单的典型应用。

ps:不是说爬虫一定做摧毁性的工作,有些小型网站需要爬虫为其带来一些流量。

(2)白名单

对于安全性更高的应用访问,仅仅靠黑名单是不能解决安全问题的,此时需要设定可访问的用户群体, 依赖白名单做更为苛刻的访问验证。

 (3)  使用微信的过程中,当微信接收消息后,会默认将最近接收的消息置顶,当多个好友及关注的订阅号同时发 送消息时,该排序会不停的进行交替。同时还可以将重要的会话设置为置顶。一旦用户离线后,再次打开微信时,消息该按照什么样的顺序显示。       

你可能感兴趣的:(redis)