redis入门

Redis的使用
1.redis的简单介绍:
1.什么是redis?
nosql
缓存技术
C语言编写
数据保存在内存中,以key-value的字符串形式保存,编码格式为UTF-8
2.为什么要使用redis?
频繁的访问数据库中的相同的数据,用户访问量大,高并发的情况下使用。
为了减轻数据库的访问压力,同时提升数据的访问速度(redis的数据在内存中)。
3.与传统数据访问的区别:

2.redis的安装与服务启动
2.1redis安装
①redis是C语言开发的,那么安装redis需要在linux安装c语言运行环境
命令:gcc 用于查看c语言编译环境,提示gcc没有需要运行的文件就表示环境存在。
在线安装c语言运行环境:Yum install gcc-c++
②linux下的redis安装包复制到linux下,使用FileZilla软件上传文件到linux中。


③解压缩:tar -xvf redis-3.0.0.tar.gz
④编译。在root下执行make指令
⑤在usr/local下创建redis文件夹,安装。make install PREFIX=/usr/local/redis
2.2redis服务的启动
①前端启动redis:在usr/local/redis/bin目录下执行命令:./redis-server

前端启动弊端:运行后不能操作其他指令

解决:Ctrl+C关闭redis
②后台启动redis:
①将redis解压缩后的文件中的redis.conf配置文件,复制到bin目录下,修改
把/root/redis-3.0.0/redis.conf复制到/usr/local/redis/bin目录下
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis/bin/
修改配置文件:

②运行:[root@localhost bin]# ./redis-server redis.conf
③查看运行进程:[root@localhost bin]# ps aux|grep redis
2.3连接redis服务:Redis-cli

[root@localhost bin]# ./redis-cli
默认连接localhost运行在6379端口的redis服务。
[root@localhost bin]# ./redis-cli -h 192.168.25.153 -p 6379
-h:连接的服务器的地址
-p:服务的端口号
2.4单机redis操作中文

3.redis的数据类型
3.1 String:key-value(做缓存)
所有的数据都是字符串,命令不区分大小写,key区分大小写。
Redis是单线程。不适合保存内容大的数据
常用命令:set,get,decr,incr,mget 等。
应用场景:String是最常用的一种数据类型,普通的key/value存储都可以归为此类
实现方式:String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。
3.2 Hash:key-fields-value(做缓存)
①相当于key-map(fields-value)
常用命令:hget,hset,hgetall 等。
应用场景:
①如果需要保存一个对象数据,对象的id可以作为key,可以采用String的方式存储,但是这个id可能与其他id重复,这个时候就不能用该key作为String方式存储。
②即使这个id不会出现重复的情况,使用这个id作为key存储,如果需要修改这个对象中的一项,这时候就需要通过key取出所有对象信息,加大了序列化与反序列化的开销,这个时候就可以通过 id+field字段来取具体的项来修改解决。这就是使用Hash的方式。
3.3 List:有顺序可重复
常用指令:lpush,rpush,lpop,rpop,lrange等。
使用场景:可以轻松地实现最新消息排行等功能,另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。
3.4 Set:无顺序,不能重复
常用指令:sadd,spop,smembers,sunion 等。
使用场景:在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
3.5 SortedSet(zset):有顺序,不能重复
常用指令:zadd,zrange,zrem,zcard等。
sortedSet可以做排行榜,例如:微信运动中会显示步数排行

4.与key相关的命令
①Expire:(设置某一个key的过期时间)
例如:有一个”hello”的key
Expire hello 100---设置”hello”的过期时间为100秒
②ttl:查看某个key的有效期(查看key的状态)
Ttl hello -----查看这个hello的key的有效期
命令结果显示:
Ttl key返回 -1: 这个key处于持久化状态
Ttl key 返回 -2:这个key不存在
③persist:-----清除key的过期时间,持久化,即使key到了过期时间也会存在
例如:将key为”hello”设置持久化
Persist hello
命令结果显示:
Persist key返回 0---表示持久化这个key失败
Presist key返回 1 表示操作成功

5.redis完成数据持久化方案
Redis的所有数据是保存在内存中。(redis是缓存技术,redis允许数据丢失,丢失就从数据库中查,尽量不要存储敏感数据)
①Rdb:快照(默认支持),速度快,可能引发数据丢失,几率较高。
②Aof(append only file):写文件的方式完成持久化,能最大化保持数据的持久化,速度慢。手动设置redis.conf中的

*快照的使用场景:订单模块中。
例如:京东上销售一块手表1000元,客户在早晨下单购买一块该手表,并在一定时间内未完成支付,这个时间内,京东将该手表进行了打折,那么客户下单时并没有促销活动,所以订单的价格不作改变,这个时候查询该订单,是查询到在下单时的数据,这个数据就来自生成订单时的快照表(定期将内存中的数据保存到磁盘)。
③在数据类型中使用persist中设置持久化与redis的持久化方案有什么区别?
Persist设置的持久化是设置某个key的持久化,而使用Rdb快照与AOF持久化是对整个redis的持久化。
6.redis集群
6.1Redis集群的架构图:


6.2搭建redis集群
前提:因为我们没有那么多服务器,所以在一台电脑上去搭建伪集群。
Redis伪集群搭建步骤:
6.2.1需要6个redis实例:
至少需要三个节点,才能使用投票机制检查redis是否不可用。每个节点需要有备份,实现redis的高可用。
在linux的根目录下 usr/local/redis中存在单机redis的安装目录,将bin目录复制6个到usr/local/redis新建的redis-cluster文件夹下。
指令:
[local下:] cp redis/bin redis-cluster/redis01 -r
[local下:] cp redis/bin redis-cluster/redis02 -r
[local下:] cp redis/bin redis-cluster/redis03 -r
........拷贝6个

1.对每个redis实例修改配置文件:修改port【7001~7006】 以及注释开启cluster-enabled yes,并且检查是否有持久化文件,有就删除

6.2.2建立批处理命令后台启动redis服务
在redis-cluster目录下:
①Vim start-all.sh
②运行的指令:
cd redis01
./redis-server redis.conf
Cd ..
cd redis02
./redis-server redis.conf
Cd ..
...拷贝6个即可

6.2.3建立完批处理命令后:修改批处理文件的权限
修改自己的权限指令:chmod u+x start-all.sh

运行伪集群redis---->

6.2.4安装ruby的运行环境
原因:使用ruby脚本搭建集群,使用脚本前需要安装ruby的运行环境
①有网环境下,安装ruby
yum install ruby
yum install rubygems
②安装ruby脚本运行使用的包。
[root@localhost ~]# gem install redis-3.0.0.gem
Successfully installed redis-3.0.0
1 gem installed
Installing ri documentation for redis-3.0.0...
Installing RDoc documentation for redis-3.0.0...
[root@localhost ~]#
[root@localhost ~]# cd redis-3.0.0/src
[root@localhost src]# ll *.rb
-rwxrwxr-x. 1 root root 48141 Apr 1 2015 redis-trib.rb
拷贝指令:[root@localhost src] : cp redis-trib.rb /usr/local/redis-cluster/
6.2.5使用ruby脚本搭建集群
执行下面命令之前需要:①redis的6个实例启动(已修改好的端口与开启cluster-enabled yes注释)②运行的目录在redis-cluster目录下③需要将redis-trib.rb 拷贝到redis-cluster目录下
Ruby搭建集群指令:
./redis-trib.rb create --replicas 1 192.168.25.129:7001 192.168.25.129:7002 192.168.25.129:7003 192.168.25.129:7004 192.168.25.129:7005 192.168.25.129:7006
遇到的问题:

运行结果:
>>> Creating cluster
Connecting to node 192.168.25.129:7001: OK
Connecting to node 192.168.25.129:7002: OK
Connecting to node 192.168.25.129:7003: OK
Connecting to node 192.168.25.129:7004: OK
Connecting to node 192.168.25.129:7005: OK
Connecting to node 192.168.25.129:7006: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
(三主三从)
192.168.25.129:7001
192.168.25.129:7002
192.168.25.129:7003
Adding replica 192.168.25.129:7004 to 192.168.25.129:7001
Adding replica 192.168.25.129:7005 to 192.168.25.129:7002
Adding replica 192.168.25.129:7006 to 192.168.25.129:7003
M: ec75001b28b93e5bca92302209a5d77f21256972 192.168.25.129:7001
slots:0-5460 (5461 slots) master
M: b0263d33a8bde371322395e697e00d01b558db5a 192.168.25.129:7002
slots:5461-10922 (5462 slots) master
M: 0cd96938e96d3374eacb03a04ee1a73ab68e3e28 192.168.25.129:7003
slots:10923-16383 (5461 slots) master
S: a0c3c577cd62125e0ac537a0c3124019fec96300 192.168.25.129:7004
replicates ec75001b28b93e5bca92302209a5d77f21256972
S: 068aa8116e0aa3b5c3b8ebed49363913aff6ffb2 192.168.25.129:7005
replicates b0263d33a8bde371322395e697e00d01b558db5a
S: 30342a4f0d6fd1a9387f28d940a57a3da088d8ca 192.168.25.129:7006
replicates 0cd96938e96d3374eacb03a04ee1a73ab68e3e28
输入yes指令
Can I set the above configuration? (type 'yes' to accept): yes

6.2.6建立关闭redis服务的批处理:
[root@localhost redis-cluster]# vim shutdow-all.sh
redis01/redis-cli -p 7001 shutdown
redis01/redis-cli -p 7002 shutdown
redis01/redis-cli -p 7003 shutdown
redis01/redis-cli -p 7004 shutdown
redis01/redis-cli -p 7005 shutdown
redis01/redis-cli -p 7006 shutdown
修改拥有执行权限:
[root@localhost redis-cluster]# chmod u+x shutdow-all.sh
7.使用redis集群
7.1redis内部的Redis-cli连接集群
命令:redis01/redis-cli -p 7002 -c
①加 -c代表的是连接的是集群
② redis01可以是任意集群
③伪集群不需要指定ip,只需要指定端口

按 ctrl +c退出
7.2在window下使用redisClient客户端连接
E:\BOS+电商+elasticsearch\电商\01.参考资料\redis\redis_client_view\redisclient-win32.x86_64.2.0.jar
双击这个.jar文件可以连接单机版的redisClient.





8.如何在业务逻辑中添加缓存?
需求:在做分类类容中,每次加载首页都会查询数据库中的分类类容信息,这样如果数据量非常大的情况下就会导致页面加载速度变慢,在不影响正常的业务逻辑的前提下,添加缓存,来缓解访问数据库的压力。
8.1jedis
官方推荐的java版客户端是jedis,非常强大和稳定,支持事务、管道及有jedis自身实现。我们对redis数据的操作,都可以通过jedis来完成。
①jedis的jar
Maven的坐标:
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
②单个redis的操作:
a)对String类型的操作:set(“key”,”value”) get(“key”)
b)对hash类型的操作: hset() hget()
Demo:
Jedis jedis = new Jedis("192.168.25.129", 6379);
jedis.set("mytest", "1000");
String result = jedis.get("mytest");
System.out.println(result);
jedis.close();
③采用jedisPool:
JedisPool jedisPool = new JedisPool("192.168.25.129", 6379);
//从连接池获得连接
Jedis jedis = jedisPool.getResource();
String result = jedis.get("mytest");
System.out.println(result);
//每次jedis使用完毕后需要关闭,连接池回收资源。
jedis.close();
//系统结束前关闭连接池
jedisPool.close();
单机:实际场景配置jedisPool如下:
Spring配置创建jedisPool对象
<!-- 单机版 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="192.168.25.129"/>
<constructor-arg name="port" value="6379"/>
</bean>
<bean id="jedisClientPool" class="com.taotao.content.jedis.JedisClientPool"/>
1.接口封装:(目的是将常用的操作方法通过接口进行封装)
public interface JedisClient {
String set(String key, String value);
String get(String key);
Boolean exists(String key);
Long expire(String key, int seconds);
Long hdel(String key, String... field);
}
2.单机实现类:实现类实现JedisClient 接口
public class JedisClientPool implements JedisClient {
@Autowired
private JedisPool jedisPool;
@Override
public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
String result = jedis.set(key, value);
jedis.close();
return result;
}
}
集群:配置jedisCluster
<!-- 集群版 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg name="nodes">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.129"/>
<constructor-arg name="port" value="7001"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.129"/>
<constructor-arg name="port" value="7002"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.129"/>
<constructor-arg name="port" value="7003"/>
</bean>
</set>
</constructor-arg>
</bean>
<bean id="jedisClientCluster" class="com.taotao.content.jedis.JedisClientCluster"/>
3.集群实现类:
public class JedisClientCluster implements JedisClient {
@Autowired
private JedisCluster jedisCluster;

@Override
public String set(String key, String value) {
return jedisCluster.set(key, value);
}
}
注意:单机版和集群版不能共存,使用单机版时注释集群版的配置。使用集群版,把单机版注释。
8.2向业务中添加缓存(查询内容信息的业务中)
public List<Content> getContentList(long cid) {
//先查询redis中是否存在
try {
String jsonContent = JedisClient.hget(CONTEMT_KEY, String.valueOf(cid));
if(null != jsonContent && !"".equals(jsonContent)){
List<Content> resultList = JsonUtils.jsonToList(jsonContent, Content.class);
return resultList;
}
} catch (Exception e) {
e.printStackTrace();
}
ContentExample example = new ContentExample();
Criteria criteria = example.createCriteria();
criteria.andCategoryIdEqualTo(cid);
List<Content> list = contentMapper.selectByExample(example);
//查到数据保存到redis中
//将list转换为json字符串 使用hash数据类型 存(配置的字符串作为key,map(cid,json))
try {
JedisClient.hset(CONTEMT_KEY, String.valueOf(cid), JsonUtils.objectToJson(list));
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
8.3缓存同步
①为什么要使用缓存同步:
应用场景:例如在分类类容信息查询中新增了redis缓存,改变了原来每次查询直接从数据库中取,当在做添加分类内容信息后,原来的key就不能取到新增的内容了,这就造成了数据的不同步。所以缓存同步非常有必要。
②如何实现缓存同步:
a.使用在做增删改的时候删除redis中已存在的key对应的value(不可取)
contentMapper.insert(content);
JedisClient.hdel(CONTEMT_KEY,content.getCategoryId().toString());
b.采用activeMQ消息队列处理






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值