大数据之Redis(上)


前言

Redis是基于内存的开源的key-value存储系统,本文主要介绍有关Redis的基本概念以及数据类型,在大数据之Redis(下)中介绍Redis事务、持久化、主从复制、哨兵机制以及集群的概念。


一、Redis为什么快

(1)Redis是单线程的;

(2)Redis是基于内存的;

(3)Redis采用多路IO复用技术

在这里插入图片描述
BIO:一个连接对应一个线程,一个线程会连接一个IO请求,如果请求数>线程数,那么多余的请求进行等待;

多路IO复用是只有一个线程负责IO调度,来了一个请求,线程连接一个IO请求,处理完了返回结果。但是因为只有一个线程,线程返回的时候不知道是谁发的请求,所以加了一个Mapping(映射关系),这里记录着请求的来源信息。一旦一个请求没有处理完,又来了新的请求,新来的等待。所以多路IO复用只适合数据请求少,数据写入不频繁的场景。

与此同时,消息完成返回的时候,通过Mapping向一开始的socket进行轮询来找到谁是刚刚消息的发送者。但是如果有100个socket就会轮询100遍,但是真正发数据的可能只有1,2个,浪费性能。所以出现了新的函数epoll方法,不是轮询所有的,只记录有几个发数据的,轮询发送数据的就可以;

二、BIO、NIO、AIO

BIO:一次连接一个线程,但是可能不发数据,这样就会占用线程资源

NIO:一次请求一个线程(数据请求

AIO:一次有效请求一个线程,即发送了大量的数据,但是都不是我想要的,也不会给线程资源。

三、Redis数据类型

Redis有5中常用的数据类型:String、List、Set、Hash、Zset

3.1 key

(1)查询当前库的所有键 keys *

(2)判断某一个键是否存在 exists <key>

(3)删除某一个键 del <key>

(4)查看键的类型 type <key>

(5)设置键过期时间 expire <key> <seconds>

(6)查看还有多少秒过期 TTL <key> ,-1表示永不过期,-2表示已过期

(7)查看当前数据库key的数量 dbsize

(8)清空当前库 flushdb

(9)通杀所有库 flushall

3.2 String

(1)数据库中放入数据 set <key> <value> 添加键值对

(2)查询对应键值 get <key>

(3)在指定键值后面追加指定的值 append <key> <value>

(4)获得值的长度 strlen <key>

(5)在key不存在时设置key的值(类似于set),如果key存在什么都不做,而set会覆盖掉原来的值

(6)将key对应的值+1 或者 -1 ;incr / decr <key> ,如果为空(key不存在),新增值为1/-1;注意只能对数字值操作。

(7)将 key 中储存的数字值增减。自定义步长;
  incrby / decrby <key> <步长>

(8)同时设置一个或多个 key-value对;
  mset <key1> <value1> <key2> <value2> …

(9)同时获取一个或多个 value
  mget <key1> <key2> <key3> …

(10)同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
  msetnx <key1> <value1> <key2> <value2> …

(11)获得值的范围,类似java中的substring
  getrange <key> <起始位置> <结束位置>
  getrange k1 0
, -1表示取出所有的字符串,换成-2就是取到倒数第二个字符串;

(12)用 <value> 覆写<key> 所储存的字符串值,从<起始位置>开始。
  setrange <key> <起始位置> <value>

(13)设置键值的同时,设置过期时间,单位秒。
  setex <key> <过期时间> <value>

(14)以新换旧,设置了新值同时获得旧值
  getset <key> <value>

3.3 List

3.3.1 Redis List的特点

(1)单键多值

(2)Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

(3)它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

3.3.2 相关操作

(1)从左边/右边插入一个或多个值。
  lpush/rpush <key> <value1> <value2> <value3> …
  例如:lpush k1 v1 v2 v3 v4
  列表的顺序:v4 v3 v2 v1因为是左侧插入
  Rpush v5 v6 v7
  列表的顺序:v4 v3 v2 v1 v5 v6 v7
(2)从左边/右边吐出一个值。值在键在,值亡键亡
  lpop/rpop <key>

(3)从<key1>列表右边吐出一个值,插到<key2>列表左边
  rpoplpush <key1> <key2>

(4)按照索引下标获得元素(从左到右)
  lrange <key> <start> <stop>
  lindex <key> <index>

(5)获得列表长度
   llen <key>

(6)在<value>的前面插入<newvalue>
  linsert <key> before <value> <newvalue>

(7)从左边删除n个value(从左到右)
  lrem <key> <n> <value>

3.4 Set

 set可以自动去重,是无序的,并且还提供了判断某一个元素在不在一个set集合内的接口;

(1)将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
  sadd <key> <value1> <value2> …

(2)取出该集合的所有值。
  smembers <key>

(3)判断集合<key>是否为含有该<value>值,有返回1,没有返回0。如果输入的key不存在也返回0.
  sismember <key> <value>

3.5 Hash

3.5.1 数据结构

仍然存储的是key-value的形式,但是value里面类似于一个map,即还是一个key-value的形式。
在这里插入图片描述

3.5.2 相关操作

(1)给<key>集合中的 <field>键赋值<value>
  hset <key> <field> <value>

(2)从<key1>集合<field> 取出 value
  hget <key1> <field>

(3)批量设置hash的值
  hmset <key1> <field1> <value1> <field2> <value2>…

(4)查看哈希表 key 中,给定域 field 是否存在。
  hexists key <field>

(5)列出该hash集合的所有field
  hkeys <key>

(6)将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .
  hsetnx <key> <field> <value>

(7)为哈希表 key 中的域 field(只能是数值)的值加上增量 increment
  hincrby <key> <field> <increment>

3.6 Zset

  Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。与此同时zset是有序的。但是他这个有序不是排序,而是在输入数据的时候对每一个数据增加一个评分,根据评分来排序。


总结

本文主要介绍了有关Redis的基本概念以及数据类型,在大数据之Redis(下)中主要介绍Redis事务、持久化、主从复制、哨兵机制以及集群的概念,如果有不足之处或者表述不当的地方欢迎大家指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值