Redis入门(一)

内容为网络搜集整理,如有侵权,请联系删除!

一、Redis简介

Redis是一个开源的使用 C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它支持存储多种数据类型,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。
为了保证效率,数据都是缓存在内存中。redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

二、Redis应用场景

Redis 在 Java Web 主要有两个应用场景:
1、存储缓存用的数据;
2、需要高速读/写的场合使用它快速读/写;

缓存场景:
在日常对数据库的访问中,读操作的次数远超写操作,比例大概在 1:9 到 3:7,所以需要读的可能性是比写的可能大得多的。当我们使用SQL语句去数据库进行读写操作时,数据库就会去磁盘把对应的数据索引取回来,这是一个相对较慢的过程。
如果我们把数据放在 Redis 中,也就是直接放在内存之中,让服务端直接去读取内存中的数据,那么这样速度明显就会快上不少,并且会极大减小数据库的压力,但是使用内存进行数据存储开销也是比较大的,限于成本的原因,一般我们只是使用 Redis 存储一些常用和主要的数据,比如用户登录的信息等。
一般而言在使用 Redis 进行存储的时候,我们需要从以下几个方面来考虑:
(1)、业务数据常用吗?命中率如何?如果命中率很低,就没有必要写入缓存;
(2)、该业务数据是读操作多,还是写操作多?如果写操作多,频繁需要写入数据库,也没有必要使用缓存;
(3)、业务数据大小如何?如果要存储几百兆字节的文件,会给缓存带来很大的压力,这样也没有必要;
(4)、在考虑了这些问题之后,如果觉得有必要使用缓存,那么就使用它!使用 Redis 作为缓存的读取逻辑如下图所示:
在这里插入图片描述
从上图我们可以知道以下两点:
(1)、当第一次读取数据的时候,读取 Redis 的数据就会失败,此时就会触发程序读取数据库,把数据读取出来,并且写入 Redis 中;
(2)、当第二次以及以后需要读取数据时,就会直接读取 Redis,读到数据后就结束了流程,这样速度就大大提高了。
从上面的分析可以知道,读操作的可能性是远大于写操作的,所以使用 Redis 来处理日常中需要经常读取的数据,速度提升是显而易见的,同时也降低了对数据库的依赖,使得数据库的压力大大减少。
下面我们来看看写操作的流程:
在这里插入图片描述
从流程可以看出,更新或者写入的操作,需要多个 Redis 的操作,如果业务数据写次数远大于读次数那么就没有必要使用 Redis。

高速读/写的场景:
在如今的互联网中,越来越多的存在高并发的情况,比如天猫双11、抢红包、抢火车票等,这些场合都是在某一个瞬间或者是某一个短暂的时刻有成千上万的请求到达服务器,如果单纯的使用数据库来进行处理,就算不崩,也会很慢的,轻则造成用户体验极差用户量流失,重则数据库瘫痪,服务宕机,而这样的场合都是不允许的!
所以我们需要使用 Redis 来应对这样的高并发需求的场合,我们先来看看一次请求操作的流程图:
在这里插入图片描述
我们来进一步阐述这个过程:
(1)、当一个请求到达服务器时,只是把业务数据在 Redis 上进行读写,而没有对数据库进行任何的操作,这样就能大大提高读写的速度,从而满足高速响应的需求;
(2)、但是这些缓存的数据仍然需要持久化,也就是存入数据库之中,所以在一个请求操作完 Redis 的读/写之后,会去判断该高速读/写的业务是否结束,这个判断通常会在秒杀商品为0,红包金额为0时成立,如果不成立,则不会操作数据库;如果成立,则触发事件将 Redis 的缓存的数据以批量的形式一次性写入数据库,从而完成持久化的工作。

三、Redis支持数据类型

1、字符串(String)
Redis中的字符串是一个字节序列。Redis中的字符串是二进制安全的,这意味着它们的长度不由任何特殊的终止字符决定。因此,可以在一个字符串中存储高达512MB的任何内容。
示例:

redis 127.0.0.1:6379> set name supcon.com
OK 
redis 127.0.0.1:6379> get name 
"supcon.com"

在上面的示例中,set和get是Redis的命令,name是Redis中使用的键,supcon.com是存储在Redis中的字符串的值。
注意:Redis命令不区分大小写,如SET,Set和set都是同一个命令。字符串值得最大长度是512MB。

2、散列/哈希(Hash)
Redis散列/哈希(Hashes)是键值对的集合。Redis散列/哈希是字符串字段和字符串值之间的映射。因此,它们用于表示对象。每个散列/哈希可以存储多达2^32 - 1个健-值对(超过40亿个)。

示例

redis 127.0.0.1:6379> hmset uaccount username "supcon" password "passswd123" points 200
redis 127.0.0.1:6379> hgetall uaccount 
1)”username” 
2)"supcon" 
3)”password” 
4)"passswd123" 
5)”points” 
6)”200”

在上述示例中,散列/哈希数据类型用于存储包含用户的基本信息的用户对象。这里hmget,hgetall是Redis的命令,而uaccount是键的名称。

3、列表(List)
Redis列表只是字符串列表,按插入顺序排序。您可以向Redis列表的头部或尾部添加元素。
示例

redis 127.0.0.1:6379> lpush alist redis 
(integer) 1 
redis 127.0.0.1:6379> lpush alist mongodb 
(integer) 2 
redis 127.0.0.1:6379> lpush alist sqlite 
(integer) 3 
redis 127.0.0.1:6379> lrange alist 0 10  
1) "sqlite" 
2) "mongodb" 
3) "redis"

列表的最大长度为2^32 - 1个元素(4294967295,每个列表可容纳超过40亿个元素)。

4、集合(Set)
Redis集合是字符串的无序集合,集合成员是唯一的,类似java中的set集合。在Redis中,您可以添加,删除和测试成员存在的时间O(1)复杂性。
集合中的最大成员数量为2^32 - 1(即4294967295,每个集合中元素数量可达40亿个)个。

示例

redis 127.0.0.1:6379> sadd supconlist redis 
(integer) 1 
redis 127.0.0.1:6379> sadd supconlist mongodb 
(integer) 1 
redis 127.0.0.1:6379> sadd supconlist sqlite 
(integer) 1 
redis 127.0.0.1:6379> sadd supconlist sqlite 
(integer) 0 
redis 127.0.0.1:6379> smembers supconlist 
1) "sqlite" 
2) "mongodb" 
3) "redis"

注意:在上面的示例中,sqlite被添加了两次,但是由于集合的唯一属性,所以它只算添加一次。

5、有序集合(Sorted set)
有序集合类似于Redis的集合,是不重复的字符集合。不同之处在于,有序集合的每个成员都与分数相关联,这个分数用于按最小分数到最大分数来排序的排序集合。虽然成员是唯一的,但分数值可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2^32-1 (4294967295, 每个集合可存储40多亿个成员)。
示例

redis 127.0.0.1:6379> zadd supconset 0 redis
(integer) 1 
redis 127.0.0.1:6379> zadd supconset 0 mongodb
(integer) 1 
redis 127.0.0.1:6379> zadd supconset 1 sqlite
(integer) 1 
redis 127.0.0.1:6379> zadd supconset 1 sqlite
(integer) 0 
redis 127.0.0.1:6379> ZRANGEBYSCORE supconset 0 1000  
1) "mongodb" 
2) "redis" 
3) "sqlite"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值