Redis简介及应用

本文主要对Redis进行简单的介绍,以及展示Redis的使用实例和使用场景。

1.Redis的概念

Redis是一个开源的使用ANSI(美国国家标准协会) C语言编写、遵守BSD协议(一种开源协议)、支持网络、可基于内存可持久化的日志型、Key-Value数据库,并提供多种语言的API。

基于内存:Redis数据是直接存放在内存中的

可持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

Key-Value:键值对,根据关键字进行取值,每个键都会对应一个唯一的值。

2.Redis的安装

Windows下安装

下载地址:https://github.com/MSOpenTech/redis/releases

下载64位的压缩包

 

解压缩,内容如下:

 

   打开一个cmd窗口,运行如下命令

   cd D:\software\redis

   redis-server.exe redis.windows.conf

   这时候另外开启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了。

运行如下命令

cd D:\software\redis

redis-cli.exe -h 127.0.0.1 -p 6379

set myKey hello,redis

get myKey

 

Linux下安装

(1)下载地址:http://redis.io/download,下载最新稳定版本。

(2)下载并安装

(3)make完后 redis-2.8.17目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下:

 

下面启动redis服务.

 

注意这种方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动。redis.conf 是一个默认的配置文件。我们可以根据需要使用自己的配置文件。

(4)启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了。 比如:

3.Redis数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(有序集合)

(1)string类型是Redis最基本的数据类型,string类型的值最大能存储512MB.

set string1 “hello redis”

get string1

(2)hash是一个键值对集合,是一个string类型的field和value的映射表。

HMSET hash1 field1 “hello” field2 “world”

HGET hash1 field1

HGET hash1 field2

(3)Redis列表是简单的字符串列表,按照插入顺序排序

lpush list1 redis1

lpush list1 redis2

lpush list1 redis3

lrange list1 0 10   

//lrange key start stop(下标参数start和stop都以0为底) 返回列表中指定区间内的元素。

(4)Redis的Set是string类型的无序集合

sadd命令, 添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0.

sadd set1 redis1

sadd set1 redis2

sadd set1 redis3

sadd set1 redis1

smembers set1

(5) Redis zset set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zadd zset1 1 redis1

zadd zset1 3 redis2

zadd zset1 2 redis3

zrangebyscore zset1 0 1000

//zrangebyscore key score(min) score(max)

 

使用Redis Desktop Manager

Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。

Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。

每个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(可以通过配置文件支持更多,无上限),可以通过配置databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库,如要选择1号数据库:

redis> SELECT 1

OK

redis [1] > GET foo

(nil)

然而这些以数字命名的数据库又与我们理解的数据库有所区别。首先Redis不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。另外Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。最重要的一点是多个数据库之间并不是完全隔离的,比如FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据。综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。由于Redis非常轻量级,一个空Redis实例占用的内在只有1M左右,所以不用担心多个Redis实例会额外占用很多内存。

4.Redis的两种持久化方式

Redis具有持久化功能,其支持边运行边将内存中的数据备份到硬盘中,这样子的好处就在于:当Redis运行时服务器突然断电可以减少数据丢失的损失。

RDB持久化(数据快照)

默认开启。一次性把redis中全部的数据保存一份存储在硬盘中。默认的文件是dump.rdb.

快照持久化的配置

redis.windows.conf(linux系统下是redis.conf)

配置快照持久化的频率

save 900 1

#每900s若超过1K数据被修改,便发起一次快照保存

save 300 10

#每300s若超过10K数据被修改,便发起一次快照保存

save 60 10000

AOF持久化(仅附加文件)

AOF持久化是将用户操作Redis时修改的每一个key的语句都保存起来,还原数据库的时候直接把语句执行一遍即可(也可以理解成快照持久化保存的是数据,而AOF持久化保存的是执行语句)。

redis.windows-server.conf中配置(linux系统下是redis.conf)

设置AOF持久化频率

# appendfsync always 每次写指令都写入磁盘,即完全保证持久化(对性能影响大)

#每一秒执行一次 性能与持久化进行折中(建议使用)

appendfsync everysec

切换持久化方式

在redis的安装目录下执行如下两个命令,才能在安装目录下出现appendonly.aof文件

redis-cli config set appendonly yes

redis-cli config set save “”

两种持久化方式的对比

RDB的优点是适合大规模的数据恢复,缺点是数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。

AOF的优点是会让Redis变得非常耐久,AOF 的默认策略为每秒钟 同步 一次,在这种配置下,Redis仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据。缺点是对于相同的数据集来说,AOF文件的体积通常要大于RDB文件的体积。

5.Redis的使用实例

redis在java代码中的使用

jedis是redis的java客户端,通过jedis,可以很方便的对redis数据库进行操作。

见idea中的例子

6.Redis的使用场景

(1)缓存

缓存就是在内存中存储的数据备份,当数据没有发生本质改变的时候,我们就不让数据的查询去数据库进行操作,而去内存中取数据,这样就大大降低了数据库的读写次数,而且从内存中读数据的速度比去数据库查询要快一些,这样同时又提高了效率。

Redis用在缓存的场合非常多。

(2)计数器

什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令(将key中存储的数值值增一)来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。

(3)自动过期能有效提升开发效率

Redis针对数据都可以设置过期时间,这个特点也是大家应用比较多的,过期的数据清理无需使用方去关注,所以开发效率也比较高,当然,性能也比较高。最常见的就是:短信验证码、具有时间性的商品展示等。无需像数据库还要去查时间进行对比.

(4)排行榜

比如在线游戏的排行榜,需要实现实时数据的更新。如果使用不基于内存的数据库,而去硬盘中读取数据,那么性能不够理想。

(5)秒杀系统

使用redis可以实现秒杀系统

RPUSH key value,插入秒杀请求。当插入的秒杀请求数达到上限时,停止所有后续插入。

后台启动多个工作线程, 使用LRANGE key start end命令读取秒杀成功者的用户id,进行后续处理。

每完成一条秒杀记录的处理,就执行INCR key_num。一旦所有库存处理完毕,就结束该商品的本次秒杀,关闭工作线程,也不再接收秒杀请求。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值