NOSQL
什么是NOSQLNOSQL
NoSQL(NoSQL=Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。
解决什么问题
主流的NOSQL产品
Redis
redis概述
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。
redis的应用场景
业务流程
这样大大降低了数据库的高并发访问压力。
持久化方案
redis安装
windows:
linux:
Redis的数据类型
基本操作
Redis的通用命令
Redis的持久化
通过aof-use-rdb-preamble配置参数控制,yes则表示开启,no表示禁用,默认是禁用的,可通过config set修改。
jedis的介绍
使用Jedis操作redis需要导入jar包如下:(Jedis相当于redis的连接池)
Spring-data-redis
junit
junit
4.12
org.springframework
spring-context
5.1.7.RELEASE
org.springframework
spring-beans
5.1.7.RELEASE
org.springframework
spring-context-support
5.1.7.RELEASE
org.springframework
spring-test
5.1.7.RELEASE
redis.clients
jedis
2.8.1
org.springframework.data
spring-data-redis
1.7.2.RELEASE
redis.host=192.168.1.9
redis.port=6379
redis.pass=
redis.database=0
redis.maxIdle=300
redis.maxWait=3000
redis.testOnBorrow=true
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext-redis.xml"})
public class TestString {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testSet() {
redisTemplate.boundValueOps("name").set("it");
}
@Test
public void testGet() {
String name = (String) redisTemplate.boundValueOps("name").get();
System.out.println("name=" + name);
}
@Test
public void testDelete() {
redisTemplate.delete("name");
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext-redis.xml"})
public class TestList {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testLpush() {
redisTemplate.boundListOps("myListKey").leftPush("001");
redisTemplate.boundListOps("myListKey").leftPush("002");
redisTemplate.boundListOps("myListKey").leftPush("003");
redisTemplate.boundListOps("myListKey").leftPush("004");
}
@Test
public void testRpush() {
redisTemplate.boundListOps("myListKey").rightPush("001");
redisTemplate.boundListOps("myListKey").rightPush("002");
redisTemplate.boundListOps("myListKey").rightPush("003");
redisTemplate.boundListOps("myListKey").rightPush("004");
}
@Test
public void testRange() {
List myListKey = redisTemplate.boundListOps("myListKey").range(0, -1);
for (String s : myListKey) {
System.out.println("value=" + s);
}
}
@Test
public void testDelete() {
redisTemplate.delete("myListKey");
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext-redis.xml"})
public class TestHash {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testPut() {
redisTemplate.boundHashOps("keyname1").put("name", "zs");
redisTemplate.boundHashOps("keyname1").put("age", "20");
redisTemplate.boundHashOps("keyname1").put("phone", "121");
redisTemplate.boundHashOps("keyname1").put("email", "[email protected]");
}
@Test
public void testGetOne() {
String name = (String)redisTemplate.boundHashOps("keyname1").get("name");
System.out.println("name =" + name);
}
@Test
public void testGetAll() {
//获取所有的entries
Map testHash = (Map)redisTemplate.boundHashOps("keyname1").entries();
Set> entries = testHash.entrySet();
for (Map.Entry entry : entries) {
System.out.println("key=" + entry.getKey());
System.out.println("value=" + entry.getValue());
}
}
@Test
public void testDeleteOne() {
redisTemplate.boundHashOps("keyname1").delete("name");
}
@Test
public void testDeleteAll() {
redisTemplate.delete("keyname1");
}
}
redis设置密码
进入redis命令模式(/usr/local/redis-4.0.9/6379/bin/redis-cli)
config set requirepass admin
auth admin
实例:使用redis缓存广告
com.fasterxml.jackson.core
jackson-databind
2.9.4
com.fasterxml.jackson.core
jackson-annotations
2.9.4
com.fasterxml.jackson.core
jackson-core
2.9.4
redis.clients
jedis
org.springframework.data
spring-data-redis
redis.host=192.168.1.9
redis.port=6379
redis.pass=admin
redis.database=0
redis.maxIdle=300
redis.maxWait=3000
redis.testOnBorrow=true
这样大大降低了数据库的高并发访问压力。
@Transactional
@Service
public class ContentServiceImpl implements ContentService {
@Autowired
private ContentDao contentDao;
@Autowired
private RedisTemplate redisTemplate;
@Override
public PageResult findPage(Content content, Integer page, Integer 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()+"%");
}
}
Page contentList = (Page)contentDao.selectByExample(query);
return new PageResult(contentList.getTotal(), contentList.getResult());
}
@Override
public void add(Content content) {
/**
* 1. 将新广告添加到数据库中
*/
contentDao.insertSelective(content);
/**
* 2. 根据分类id, 到redis中删除对应分类的广告集合数据
*/
redisTemplate.boundHashOps(Constants.CONTENT_LIST_REDIS).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(Constants.CONTENT_LIST_REDIS).delete(oldContent.getCategoryId());
/**
* 3. 根据传入的最新的广告对象中的分类id, 删除redis中对应的广告集合数据
*/
redisTemplate.boundHashOps(Constants.CONTENT_LIST_REDIS).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(Constants.CONTENT_LIST_REDIS).delete(content.getCategoryId());
/**
* 3. 根据广告id删除数据库中的广告数据
*/
contentDao.deleteByPrimaryKey(id);
}
}
}
@Override
public List findByCategoryId(long categoryId) {
ContentQuery query = new ContentQuery();
ContentQuery.Criteria criteria = query.createCriteria();
criteria.andCategoryIdEqualTo(categoryId);
List list = contentDao.selectByExample(query);
return list;
}
@Override
public List findByCategoryIdFromRedis(Long categoryId) {
/**
* 1. 首先根据分类id到redis中获取数据
*/
List contentList = (List)redisTemplate
.boundHashOps(Constants.CONTENT_LIST_REDIS)
.get(categoryId);
/**
* 2. 如果redis中没有数据则到数据库中获取数据
*/
if (contentList == null) {
/**
* 3. 如果数据库中获取到数据, 则放入redis中一份
*/
contentList = findByCategoryId(categoryId);
redisTemplate.boundHashOps(Constants.CONTENT_LIST_REDIS).put(categoryId, contentList);
}
return contentList;
}
}
@RestController
@RequestMapping("/content")
public class ContentController {
@Reference
private ContentService contentService;
@RequestMapping("/findByCategoryId")
public List findByCategoryId(long categoryId){
return contentService.findByCategoryIdFromRedis(categoryId);
}
}