您好,欢迎来到尔游网。
搜索
您的当前位置:首页Redis入门(一)

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 作为缓存的读取逻辑如下图所示:

高速读/写的场景:
在如今的互联网中,越来越多的存在高并发的情况,比如天猫双11、抢红包、抢火车票等,这些场合都是在某一个瞬间或者是某一个短暂的时刻有成千上万的请求到达服务器,如果单纯的使用数据库来进行处理,就算不崩,也会很慢的,轻则造成用户体验极差用户量流失,重则数据库瘫痪,服务宕机,而这样的场合都是不允许的!
所以我们需要使用 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"

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- axer.cn 版权所有 湘ICP备2023022495号-12

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务