redis 原理 安装

原理-->安装-->小案例

一、原理介绍

(1)什么是?

  redis 就是一个数据库,底层使用C语言编写的 , 存储数据在内存中被广泛应用于缓存方向

(2)业务流程

  获取数据先从redis 获取,如果获得数据直接返回,就不访问数据库了

  如果得不到数据,可以直接从数据库中查询 , 查询后放入到redis中一份 , 下一次再访问的时候从redis中查询到

(3)支持的数据类型

  String
  List
  Set 求交集、并集
  zSet 
  hash

(4)能否将数据持久化,如何实现?

1)RDB持久化原理:(分时持久化)

  通过bgsave命令触发,然后父进程执行fork操作创建子进程,子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换(定时一次性将所有数据进行快照生成一份副本存储在硬盘中)

  优点:是一个紧凑压缩的二进制文件,Redis加载RDB恢复数据远远快于AOF的方式。

  缺点:由于每次生成RDB开销较大,非实时持久化,

2)AOF持久化原理:(实时持久化)

  开启后,Redis每执行一个修改数据的命令,都会把这个命令添加到AOF文件中。

  优点 : 每次CRUD 数据都会持久化到硬盘上 数据可靠安全 不会丢失

  缺点:所以AOF文件体积逐渐变大,需要定期执行重写操作来降低文件体积,加载慢


(5)与同类技术mongodb 区别

  也是一个nosql数据库 但是二者不能放在一起对比 因为完全没有可比性 使用场景完全不同

  redis 一般用于分布式缓存使用

  mongodb 主要用于硬盘存储 存储大型的文本数据 mongodb 比redis数据类型更加丰富

二、linux安装

1) cd /root 

2)  进入对应文件夹创建redis文件夹

  cd /usr/local

  mkdir redis

 

3) 将root下得压缩包复制到当前文件夹,并解压 

#cp /root/redis/redis-3.0.0.tar.gz ./

#tar -zxvf redis-3.0.0.tar.gz -C ./

4)    进入redis-3.0.0编译

[root@hostname redis-3.0.0]# make

 如果不能使用需要在linux中安装c

[root@hostname redis-3.0.0]# yum install gcc

5)

[root@hostname redis-3.0.0]# make install PREFIX='/usr/local/redis/6379'

 

[root@hostname redis-3.0.0]# cd /usr/local/redis/6379

 

[root@hostname 6379]# cd bin
[root@hostname bin]# ll

 

[root@hostname bin]# ./redis-server 

  

以上为前端启动,但由于总是前端启动不方便

接下来设置后端启动

[root@hostname bin]# cd /usr/local/redis/redis-3.0.0
[root@hostname redis-3.0.0]# ll

  

[root@hostname redis-3.0.0]# cp redis.conf /usr/local/redis/6379/bin/
[root@hostname redis-3.0.0]# cd /usr/local/redis/6379/bin/
[root@hostname redis-3.0.0]# vim redis.conf

将daemonize no 改为 daemonize yes

启动

[root@hostname redis-3.0.0]# cd /usr/local/redis/6379/bin/
[root@hostname bin]# ./redis-server redis.conf 
[root@hostname bin]# ps -ef|grep redis

  

 

 安装完成 ! 

 

 三、部署到项目中(以轮播图为例)

创建一个新的常量接口(命名为不是一定的)

public interface Contents {
    public final static String CONTENT_REDIS_KEY="contentList";
}

 

 只需在service的实现类中进行修改

每次新增修改删除后都需要对redis中的数据删

@Service
@Transactional public class ContentServiceImpl implements ContentService { @Autowired private ContentDao contentDao; @Autowired private RedisTemplate redisTemplate; @Override public List<Content> findAll() { return contentDao.selectByExample(null); } @Override public void add(Content content) {     //1 将新广告添加到数据库中     contentDao.insertSelective(content);    //2根据分类 到redis中删除对应的分类广告集合数据 redisTemplate.boundHashOps(Contents.CONTENT_REDIS_KEY).delete(content.getCategoryId()); } @Override public Content findOne(Long id) { return contentDao.selectByPrimaryKey(id); } @Override public void update(Content content) {     //1 根据广告ID 到数据库中 查询广告对象 Content oldContent = contentDao.selectByPrimaryKey(content.getId());     //2根据广告对象中的分类id 删除redis中对应的广告集合数据 redisTemplate.boundHashOps(Contents.CONTENT_REDIS_KEY).delete(oldContent.getCategoryId());   //3根据广告对象中的分类最新id 删除redis中对应的广告集合数据 redisTemplate.boundHashOps(Contents.CONTENT_REDIS_KEY).delete(content.getCategoryId());     //4 将新的广告对象更新到数据库中      contentDao.updateByPrimaryKeySelective(content); } @Override public void delete(Long[] ids) { if(ids!=null){ for(Long id:ids){           // 1 根据广告ID 到数据库中 查询广告对象 Content content = contentDao.selectByPrimaryKey(id);           //2 根据广告对象中的分类id 删除redis中对应的广告集合数据 redisTemplate.boundHashOps(Contents.CONTENT_REDIS_KEY).delete(content.getCategoryId());           //3 根据广告id 删除数据库中的广告数据 contentDao.deleteByPrimaryKey(id); } } } @Override public PageResult findPage(Content content, int page, int rows) { PageHelper.startPage(page,rows); ContentQuery query = new ContentQuery(); ContentQuery.Criteria criteria = query.createCriteria(); if(content!=null){ if(content.getTitle()!=null&&!"".equals(content.getTitle())){ criteria.andTitleLike("%"+content.getTitle()+"%"); } } contentList = contentDao.selectByExample(query); return new PageResult(contentList.getTotal(),contentList.getResult()); } //首页 轮播图 @Override public List<Content> findByCategoryId(Long categoryId) { ContentQuery query = new ContentQuery(); ContentQuery.Criteria criteria = query.createCriteria(); criteria.andCategoryIdEqualTo(categoryId); return contentDao.selectByExample(query); } //首页 轮播图 通过redis @Override public List<Content> findByCategoryIdFromRedis(Long categoryId) { //1根据分类id到redis 中获取数据 contentList = redisTemplate.boundHashOps(Contents.CONTENT_REDIS_KEY).get(categoryId); //2 如果redis中没有数据 到数据库中取数据 if(contentList==null){ contentList = findByCategoryId(categoryId); //3 如果从数据库中取到数据 则放入redis中一份 redisTemplate.boundHashOps(Contents.CONTENT_REDIS_KEY).put(categoryId,contentList); } return contentList; } }

  

四、注意

@Test
public void testPut(){
redisTemplate.boundHashOps("listHash").put("001","zzz");
redisTemplate.boundHashOps("listHash").put("002","yyy");
redisTemplate.boundHashOps("listHash").put("003","lll");
redisTemplate.boundHashOps("listHash").put("004","bbb");
}
@Test
public void testGetAll(){
Map<String,String> entries = redisTemplate.boundHashOps("listHash").entries();
//map 为hash类型的时候 不能遍历 需要转为set类型
Set<Map.Entry<String, String>> entrySet = entries.entrySet();
for(Map.Entry<String, String> map:entrySet ){
System.out.println("==key值=="+map.getKey()+"====");
System.out.println("==value值=="+map.getValue()+"====");
}
}

 

原文地址:https://www.cnblogs.com/shiliuhuanya/p/12093313.html