详解JavaEE 使用 Redis 数据库进行内容缓存和高访问负载

NoSQL(Not Only SQL),泛指非关系型数据库,是为了处理高并发读写、海量数据的高效率存储和访问、高扩展性和高可用性而产生的。

分类 相关产品 典型应用 数据模型 优点 缺点
键值对(Key-Value)存储 Redis、Voldemort、Berkeley DB 内容缓存、处理高访问负载 一系列键值对 快速查询 存储的数据缺少结构化
列存储数据库 Cassandra、HBase、Riak 分布式文件系统 以列簇式存储,将同一列数据存在一起 查询速度快,可扩展性强,更容易进行分布式扩展 功能相对局限
文档型数据库 MongoDB、CouchDB Web应用 一系列键值对 数据结构要求不严格 查询性能不高,缺乏统一的查询语法
图形数据库 Neo4j、InfoGrid 社交网络,推荐系统,专注于构建关系图谱 图结构 利用图结构相关算法 需要对整个图做计算才能得出结果,不容易做分布式的集群方案

本篇将主要阐述如何使用 Redis(https://github.com/antirez/redis)数据库进行内容缓存和高访问负载,redis 使用 C 语言开发的一个开源的高性能的键值对数据库,通过提供多种键值数据类型来适应不同场景下的存储需求,目前 Redis 支持的键值数据类型有很多种,比如字符串类型、列表类型、有序集合类型、散列类型、集合类型。Redis 官方也给我们提供了一些测试数据,有 50 个并发程序来执行 10 万次请求,Redis 读的速度达到了 11 万次/秒,写的速度达到了 8.1 万次/秒。

Redis 最广泛的应用场景就是使用它作为缓存(新闻或商品内容、聊天式的在线好友列表),除此还有任务队列(秒杀、抢购)、网站访问统计、数据过期处理(可以精确到毫秒)、应用排行榜、分布式集群架构中的 session 分离等。

1.Linux下安装Redis数据库

$ scp ~/Downloads/redis-4.0.1.tar.gz root@192.168.2.10:/usr/local //上传安装包
$ ssh root@192.168.2.10             //SSH连接

# yum -y install gcc gcc-c++ autoconf automake  //gcc、gcc-c++的库文件
# cd /usr/local
# tar -zxvf redis-4.0.1.tar.gz          //解压缩
# cd redis-4.0.1                 //切换到该目录下
# make                      //编译,将.c文件编译为.o文件
# make PREFIX=/usr/local/redis install      //指定路径安装
# cd /usr/local
# ls                       //如果存在redis文件夹,则安装成功

其中 /usr/local/redis/bin/ 下包含:

redis-benchmark         //性能测试的一个工具
redis-check-aof         //aof文件修复的一个工具 redis-check-aof --fix appendonlly.aof
redis-check-dump         //rdb文件检查的一个工具,rdb文件为Redis默认数据库文件
redis-check-rdb         //rdb文件修复的一个工具 redis-check-rdb --fix dump.rdb
redis-cli            //命令行的一个客户端
redis-sentinel -> redis-server
redis-server           //redis服务器启动的命令

接下来继续我们的命令:

# cd redis-4.0.1
# cp redis.conf /usr/local/redis
# cd /usr/local/redis
# vim redis.conf         //编辑Redis的配置文件

具体配置步骤:

1)绑定你的授权ip地址:修改69行的 bind 127.0.0.1 为 bind [host](绑定到所有网络: 注释掉69行的 bind 127.0.0.1)

2)关闭保护模式:将88行的 protected-mode yes 修改为 daemonize no

3)配置后台启动:将136行的 daemonize no 修改为 daemonize yes

4)配置 Redis 持久化: RDB方式(默认支持,不需要配置)和AOF方式(将509行的appendonly no 修改为 appendonly yes,538-540为同步策略的设置,开启 appendfsync always,注释 appendfsync everysec,always为没修改一次就同步,everysec为每一秒同步,no为不同步,为了安全此处选择 always)。

编辑完成后退出 vim,之后还需要开放 Redis 的 6379 端口:

# vim /etc/sysconfig/iptables   //打开Linux防火墙的设置
//增加代码 -A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT

//退出 vim,执行防火墙重启命令
# service iptables restart
# ./bin/redis-server ./redis.conf //启动redis服务器,可以通过 ps -ef | grep -i redis 查看启动是否成功

还有一些其他 Redis 命令如下:

# ./bin/redis-cli shutdown    //停止redis服务器
# ./bin/redis-cli         //打开redis命令行客户端

2.Redis的数据结构

需要知道的是,Redis 的 Key 设置不要过长也不要过短,要有统一的命名规范。先看一下 keys 的操作:

$ ssh root@192.168.2.10     //SSH连接
# /usr/local/redis/bin/redis-cli
> keys *             //显示所有的key
> keys my?            //显示以my开头的所有key
> del my1 my2 my3        //删除my1、my2、my3
> exists my1           //检查是否存在,存在返回1,不存在返回0
> get my1            //获取key的value值
> rename my1 my2         //重命名my1为my2
> expire my1 1000        //设置key过期时间,单位秒
> ttl my1            //剩余超时时间,没有设置则返回-1
> type my1            //获取key对应value的类型

1.存储字符串 String

二进制是安全的,存入和获取的数据相同;Value 最多可以容纳的数据长度是 521 M。存储 String 常用的命令:

> set name zhangsan       //赋值 set [key][value]
> get name            //取值 get [key]
> getset name lisi        //取值并赋值
> del name            //删除 del [key]
> incr num            //数值递增1,如果没有就默认创建0并递增1 incr [key]
> decr num            //数值递减1,如果没有就默认创建0并递减1
> incrby num2 5         //数值递增指定值,如果没有就默认创建0 incrby [key][指定值]
> decrby num2 5         //数值递减指定值,如果没有就默认创建0 decrby [key][指定值]
> append num3 5         //插入指定内容,如果有则追加内容,如果没有则新创建 append [key][插入值]

2.存储哈希 Hash

存储 Hash 可以看成是 String Key 和 String Value 的 Map 容器,适合存储 值-对象 的信息,例如用户名、密码、年龄等等,每一个 Hash 可以存储 4294967295 个键值对。存储 Hash 常用的命令:

> hset myhash username tom    //赋值单个属性 hset [key][Hash键值对]
> hmset myhash username tom2 rose age 20 //赋值多个属性 hmset [key][Hash键值对1] rose [Hash键值对2]
> hget myhash username      //获取单个属性 hget [key][key2]
> hmget myhash username age   //获取多个属性 hget [key][key2][key3]
> hgetall myhash         //获取全部值

> hdel myhash username age    //删除多个属性
> del myhash           //删除整个集合
> hincrby myhash age 5      //增加属性值
> hexists myhash username    //判断某个属性中的key是否存在,存在返回1,不存在返回0
> hlen myhash          //获取属性个数 hlen [key1]
> hkeys myhash          //获取所有属性名称 hkeys [key1]

3.存储字符串列表 List

在 Redis 中,List(ArrayList 使用数组方式,LinkedList 使用双向链表方式)顺序是按照插入顺序排序的一个字符串链表,和数据结构中的普通链表是一样的,可以在它的头部和尾部添加新的元素,在插入的时候,如果该 key 不存在,那么 Redis 就会为这个键创建一个新的链表,相反,如果链表中所有元素都被移除了,那么该键也会被从数据库中删除。存储 List 常用的命令:

> lpush mylist a b c     //从双向链表的头部开始添加,如果mylist不存在则创建 lpush [key][value1][value2]..
> lpushx mylist d       //从双向链表的头部开始添加,如果mylist不存在则不插入
> rpush mylist 1 2 3     //从双向链表的尾部开始添加
> lrange mylist 0 5      //查看链表 lrange [key][开始位置][结束位置]

> lpop mylist         //弹出双向链表的头部元素,弹出后,双向链表中就没有这个元素了
> rpop mylist         //弹出双向链表的尾部元素
> rpoplpush mylist1 mylist2  //将mylist1里面头部元素弹出插入mylist2头部
> llen mylist         //获取元素个数 llen [key]

> lrem mylist 1 2       //从头到尾删除1个2 lrem [key][删除的个数][删除的元素]
> lrem mylist -1 2      //从尾到头删除1个2
> lrem mylist 0 2       //从尾到头删除所有2

> lset mylist 3 k       //第三个value值设置为k
> linsert mylist before b 11 //第一个b之前插入11
> linsert mylist after b 22  //第一个b之后插入22

rpoplpush 命令在消息发布系统中的使用场景:

4.存储字符串集合 Set

和 List 类型不同的是,Set 集合中不允许出现重复的元素,无序的,Set 可以包含的最大元素数量是 4294967295。存储 Set 常用的命令:

> sadd myset a b c      //向Set中添加了三个值 sadd [key][Set集合值]
> srem myset a b       //删除指定元素
> smembers myset       //查看Set中元素 smembers [key]
> sismember myset c      //判断Set中是否存在c,存在返回1,不存在返回0

> sdiff myset myset2     //返回两个Set集合的差集运算
> sdiffstore my my1 my2    //将两个Set集合的差集存储到另一个集合(my)中
> sinter myset myset2     //返回两个Set集合的交集运算
> sunion myset myset2     //返回两个Set集合的并集运算

> scard myset         //返回Set集合成员数量
> srandmember myset      //随机返回Set中一个成员

5.存储有序字符串集合 SortedSet

SortedSet 中的成员在集合中的位置是有序的。存储 SortedSet 常用的命令:

> zadd mysort 65 aa 85 bb 95 cc //有序添加元素 zadd [key][姓名 分数][姓名 分数]...
> zscore mysort aa       //获得分数
> zcard mysort         //返回集合成员数量
> zrem mysort tom cc      //删除元素

> zrange mysort 0 -1      //范围查询,-1表示最后,显示姓名
> zrange mysort 0 -1 withscores //范围查询,姓名分数都会显示
> zrevrange mysort 0 -1 withscores //范围查询,由大到小排序显示

> zremrangebyrank mysort 0 2  //按照排序的范围进行删除,0~2位置
> zremrangebyscore mysort 70 90 //按照分数进行删除,70~90

> zrangebyscore mysort 0 90   //按照分数查0~90之间的
> zrangebyscore mysort 0 90 withscores limit 0 2 //按照分数查0~90之间的,由大到小排序,只显示前2个
> zcount mysort 60 100     //获取60~100之间的个数

SortedSet 可以应用于游戏的积分排行榜、构建索引数据。

3.Redis的多数据库和事务

一个 Redis 实例最多可以提供16个数据库(0-15),默认连接第 0 号数据库,也可以通过select 选择数据库:

> select 1           //选择1号数据库
> move myset 2         //移动myset到2号数据库

支持事务(所有命令都将串行化执行)的操作:

> multi     //开启事务
> exec     //提交事务
> discard    //回滚事务

4.使用Jedis操作Redis数据库

Jedis(https://github.com/xetorthio/jedis)是 Redis 官方首选的 Java 客户端开发包,

需要添加 Maven 依赖:

<!-- jedis -->
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>2.9.0</version>
  <type>jar</type>
  <scope>compile</scope>
</dependency>

普通方式操作 Redis:

Jedis jedis = null;
try {
  jedis = new Jedis("123.57.73.52",6379);
  jedis.set("name", "zhangsan");           //保存数据
  String value = jedis.get("name");         //获取数据
  System.out.println(value);
} catch (Exception e) {
  e.printStackTrace();
} finally {
  jedis.close();                   //释放资源
}

使用 Jedis 连接池操作 Redis:

//获得连接池的配置对象
JedisPoolConfig config = new JedisPoolConfig();
//设置最大连接数, 默认8个
config.setMaxTotal(8);
//设置最大空闲连接数, 默认8个
config.setMaxIdle(8);
//获得连接池
JedisPool jedisPool = new JedisPool(config, "123.57.73.52",6379);

//获得核心对象
Jedis jedis = null;
try {
  jedis = jedisPool.getResource();
  jedis.set("name2", "lisi");            //保存数据
  String value = jedis.get("name2");        //获取数据
  System.out.println(value);
} catch (Exception e) {
  e.printStackTrace();
} finally {
  jedis.close();                  //释放资源
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java操作redis实现增删查改功能的方法示例

    本文实例讲述了Java操作redis实现增删查改功能的方法.分享给大家供大家参考,具体如下: 首先,我们需要在windows下配置一个redis环境,具体配置教程请看:http://www.jb51.net/article/96230.htm 然后需要导入:jedis-2.7.3.jar这个包,看如下代码: package redis.main; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; imp

  • redis发布和订阅_动力节点Java学院整理

    Redis 的 pub sub实现了邮件系统,发送者(在 Redis 术语中被称为发布者)发送的邮件,而接收器(用户)接收它们.由该消息传送的链路被称为信道. Redis客户端可以订阅任何数目的通道. 例子 以下举例说明如何发布用户的概念工作.在下面的例子给出一个客户端订阅一个通道名为redisChat redis 127.0.0.1:6379> SUBSCRIBE redisChat Reading messages... (press Ctrl-C to quit) 1) "subsc

  • redis哈希类型_动力节点Java学院整理

    redis中的hash也是我们使用中的高频数据结构,它的构造基本上和编程语言中的HashTable,Dictionary大同小异,如果大家往后有什么逻辑需要用Dictionary存放的话,可以根据场景优先考虑下redis哦. 一:常用方法 只要是一个数据结构,最基础的永远是CURD,redis中的insert和update,永远只需要set来替代,比如下面的Hset,如下图: 就好像Java中的类和方法,知道传递一些啥参数就OK了,就比如要说的HSet,它的格式如下: 接下来我在CentOS里面

  • java中对Redis的缓存进行操作的示例代码

    Redis 是一个NoSQL数据库,也是一个高性能的key-value数据库.一般我们在做Java项目的时候,通常会了加快查询效率,减少和数据库的连接次数,我们都会在代码中加入缓存功能.Redis的高效缓存功能给我们解决了难题.下面我主要讲讲在Java项目中怎么去连接Redis服务器以及需要注意的事项. 1.导入必须的Jar包 使用Java操作Redis需要两个必须的Jar包:jedis-2.5.1.jar 和  commons-pool2-2.0.jar .每个版本可以不一样,根据你自己下载的

  • redis快照模式_动力节点Java学院整理

    我们知道redis是带有持久化这个能力了,那到底持久化成到哪里,持久化成啥样呢???这篇我们一起来寻求答案. 一.快照模式 或许在用Redis之初的时候,就听说过redis有两种持久化模式,第一种是SNAPSHOTTING模式,还是一种是AOF模式,而且在实战场景下用的最多的莫过于SNAPSHOTTING模式,这个不需要反驳吧,而且你可能还知道,使用SNAPSHOTTING模式,需要在redis.conf中设置配置参数,比如下面这样: # Save the DB on disk: # # sav

  • redis安装和配置_动力节点Java学院整理

    在Ubuntu上安装Redis 要安装Redis在Ubuntu上,打开终端,然后键入以下命令: $sudo apt-get update $sudo apt-get install redis-server 这将在您的计算机上安装Redis. 启动Redis $redis-server 检查Redis是否在工作? $redis-cli 这将打开一个Redis提示,如下图所示: redis 127.0.0.1:6379> 在上面的提示127.0.0.1是本机的IP地址,6379是Redis服务器运

  • redis集合类型_动力节点Java学院整理

    我们来看看Redis五大类型中的第四大类型:"集合类型",集合类型还是蛮有意思的,先看redis手册,如下: 上面就是redis中的set类型使用到的所有方法,还是老话,常用的方法也就那么四个(CURD)... 一: 常用方法 1. SAdd 这个方法毫无疑问,就是向集合里面添加数据,比如下面这样,我往fruits集合里面添加喜爱的水果. 127.0.0.1:6379> sadd fruits apple (integer) 1 127.0.0.1:6379> sadd f

  • redis发布订阅_动力节点Java学院整理

    其实在很多的MQ产品中都存在这样的一个模式,我们常听到的一个例子就是邮件订阅的场景,什么意思呢,也就是说100个人订阅了你的博客,如果博主发表了文章,那么100个人就会同时收到通知邮件,除了这个场景还能找到其他场景么,当然有啦,你想想,如果你要在内存里面做一个读写分离的程序,为了维持数据的完整性,你是不是需要保证在写入的时候,也要分发到各个读内存的程序中呢?所以说场景还是很多的,在于你的挖掘~~~ 下面还是从基本命令入手: 一:命令简介 从redis手册上面可以看到,其实"发布.订阅"

  • redis列表类型_动力节点Java学院整理

    据说60%的人使用redis看重的是redis中的list类型,那这个list有什么用呢???不用我说大家都明白,做队列使用呗,为什么用它呢,很简单呗,因为有了它我就不需要专门的MQ产品啦,比如说RabbitMQ,ActiveMQ等等...对吧. 一.实战 先我们还是看一下List列表给我们提供的方法. 这些方法还是稀里糊涂的有一些的,没关系,做队列使用的话,常用的也就四个:LPOP,LPUSH,RPOP,RPUSH,从这四个单词上面,你应该就明白这有点像数据结构中的"双端队列",对吧

  • redis哈希和集合_动力节点Java学院整理

    Redis的哈希值是字符串字段和字符串值之间的映射,所以他们是表示对象的完美数据类型在Redis中的哈希值,可存储超过400十亿键值对. 例子 redis 127.0.0.1:6379> HMSET yiibai name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000 OK redis 127.0.0.1:6379> HGET

随机推荐