一.基本知识
(1)NoSQL数据库简介
技术的分类:
1、解决功能性的问题:Java、Jsp、RDBMS、Tomcat、HTML、Linux、JDBC、SVN
2、解决扩展性的问题:Struts、Spring、SpringMVC、Hibernate、Mybatis
3、解决性能的问题:NoSQL、Java线程、Hadoop、Nginx、MQ、ElasticSearch
用这个NoSQL数据库有什么好处吗?
1.能解决CPU和内存压力:比如可以将session信息存到这个缓存数据库,某个服务器想要信息的时候就可以从和这个缓存数据库里面取。
2.缓解IO压力:将需要频繁查询的数据放到缓存数据库中。
该数据库的介绍?
“Not Only SQL” 泛指非关系型数据库。以key-value的形式来存储数据。它的特点是:不遵循SQL标准;不支持ACID;远超SQL的性能。他适用于对数据高并发的读写(秒杀功能),海量数据的读写,对数据高可扩展。这类数据库有:Memcache,Redis,MongoDB。
redis的概述和安装
Redis是一个开源的key-value存储系统,支持五种value类型,这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。他还支持不同方式的排序。为了保证效率,数据都是存储在缓存中,但是会周期性地将数据写进磁盘,并在此基础上实现了master-slave同步。
官方网站:http:/redis.io
中文网:http://www.redis.net.cn/
安装的话需要Linux的环境
这里我们先用windows的,直接解压缩就好:
redis.windows.conf:配置文件
redis-cli.exe:redis的客户端
redis-server.exe:redis服务器端
(2)命令操作
1.redis的数据结构:
redis存储的是:key,value格式的数据,其中key是字符串,value有5种不同的数据结构
value的数据结构:
1) 字符串类型 string
2) 哈希类型 hash : map格式
3) 列表类型 list : linkedlist格式。支持重复元素
4) 集合类型 set : 不允许重复元素
5) 有序集合类型 sortedset:不允许重复元素,且元素有顺序
2. 字符串类型 string
存储: set key value
获取: get key
删除: del key
3. 哈希类型 hash
存储: hset key field value
获取:hget key field: 获取指定的field对应的值
hgetall key:获取所有的field和value
删除: hdel key field
4. 列表类型 list: 可以添加一个元素到列表的头部(左边)或者尾部(右边)
添加:lpush key value: 将元素加入列表左表
rpush key value:将元素加入列表右边
获取:lrange key start end :范围获取
删除:lpop key: 删除列表最左边的元素,并将元素返回
rpop key: 删除列表最右边的元素,并将元素返回
5. 集合类型 set : 不允许重复元素
存储:sadd key value
获取:smembers key:获取set集合中所有元素
删除:srem key value:删除set集合中的某个元素
6. 有序集合类型 sortedset:不允许重复元素,且元素有顺序.每个元素都会关联一个double
类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
存储:zadd key score value
获取:zrange key start end [withscores]
删除:zrem key value
7. 通用命令
keys * : 查询所有的键
type key : 获取键对应的value的类型
del key:删除指定的key value
(3)持久化
1. redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
2. redis持久化机制:
RDB:默认方式,不需要进行配置,默认就使用这种机制。在一定的间隔时间中,检测
key的变化情况,然后持久化数据
1)编辑redis.windwos.conf文件
# after 900 sec (15 min) if at least 1 key changed
save 900 1
# after 300 sec (5 min) if at least 10 keys changed
save 300 10
# after 60 sec if at least 10000 keys changed
save 60 10000
2)重新启动redis服务器,并指定配置文件名称,进入redis安装目录,用该命令
打开: redis-server.exe redis.windows.conf
AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化
数据
1)编辑redis.windwos.conf文件
appendonly no(关闭aof) --> appendonly yes (开启aof)
# appendfsync always : 每一次操作都进行持久化
appendfsync everysec : 每隔一秒进行一次持久化
# appendfsync no : 不进行持久化
二.Jedis
1.快速入门
1)首先要导jar包
2)然后就可以写代码了
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class demo1 {@Testpublic void test(){//1. 获取连接Jedis jedis = new Jedis("localhost",6379);//2. 操作jedis.set("username","zhangsan");System.out.println(jedis.get("username"));//3. 关闭连接jedis.close();}
}
2.String数据类型
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class demo1 {@Test//String数据结构public void test2(){//1. 获取连接Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口//2. 操作//存储jedis.set("username","zhangsan");//获取String username = jedis.get("username");System.out.println(username);//可以使用setex()方法存储可以指定过期时间的 key valuejedis.setex("activecode",20,"hehe");//将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对//3. 关闭连接jedis.close();}
}
3.Map数据类型
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Map;
import java.util.Set;public class demo1 {@Test//String数据结构public void test2(){//1. 获取连接Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口//2. 操作// 存储hashjedis.hset("user","name","lisi");jedis.hset("user","age","23");jedis.hset("user","gender","female");// 获取hashString name = jedis.hget("user", "name");System.out.println(name);// 获取hash的所有map中的数据Map<String, String> user = jedis.hgetAll("user");Set<String> keySet = user.keySet();for (String key : keySet) {//获取valueString value = user.get(key);System.out.println(key + ":" + value);}//3. 关闭连接jedis.close();}
}
4.List数据结构
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.List;
public class demo1 {@Test//String数据结构public void test2(){//1. 获取连接Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口//2. 操作// list 存储jedis.lpush("mylist","a","b","c");//从左边存jedis.rpush("mylist","a","b","c");//从右边存// list 范围获取List<String> mylist = jedis.lrange("mylist", 0, -1);System.out.println(mylist);// list 弹出String element1 = jedis.lpop("mylist");//cSystem.out.println(element1);String element2 = jedis.rpop("mylist");//cSystem.out.println(element2);// list 范围获取List<String> mylist2 = jedis.lrange("mylist", 0, -1);System.out.println(mylist2);//3. 关闭连接jedis.close();}
}
5.Set数据结构
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Set;
public class demo1 {@Test//String数据结构public void test2(){//1. 获取连接Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口//2. 操作// set 存储jedis.sadd("myset","java","php","c++");// set 获取Set<String> myset = jedis.smembers("myset");System.out.println(myset);//3. 关闭连接jedis.close();}
}
6.sortedset数据结构
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Set;public class demo1 {@Test//String数据结构public void test2() {//1. 获取连接Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口//2. 操作// sortedset 存储jedis.zadd("mysortedset", 3, "亚瑟");jedis.zadd("mysortedset", 30, "后裔");jedis.zadd("mysortedset", 55, "孙悟空");// sortedset 获取Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1);System.out.println(mysortedset);//3. 关闭连接jedis.close();}
}
7.Jedis连接池,和工具类
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;public class demo1 {@Test//String数据结构public void test2() {//0.创建一个配置对象JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(50);//最大数量config.setMaxIdle(10);//1.创建Jedis连接池对象JedisPool jedisPool = new JedisPool(config,"localhost",6379);//2.获取连接Jedis jedis = jedisPool.getResource();//3. 使用jedis.set("hehe","heihei");System.out.println(jedis.get("hehe"));//4. 关闭 归还到连接池中jedis.close();}
}
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;public class JedisPoolUtils {private static JedisPool jedisPool;static{//读取配置文件InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");//创建Properties对象Properties pro = new Properties();//关联文件try {pro.load(is);} catch (IOException e) {e.printStackTrace();}//获取数据,设置到JedisPoolConfig中JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));//初始化JedisPooljedisPool = new JedisPool(config,pro.getProperty("host"),Integer.parseInt(pro.getProperty("port"))); }/*** 获取连接方法*/public static Jedis getJedis(){return jedisPool.getResource();}
}
三.SpringBoot集成
1.快速入门
1)首先导入redis的启动器依赖
<!--引入redis的环境--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test</artifactId><version>2.2.4.RELEASE</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.2.3.RELEASE</version></dependency>
2)配置配置文件,redis启动需要
spring:redis:port: 6379host: localhost
3)测试代码,要保证redis的服务端启动
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import org.junit.runner.RunWith;@RunWith(SpringRunner.class)
@SpringBootTest
public class redisTest {@Resourceprivate RedisTemplate redisTemplate;@Testpublic void test(){//字符串redisTemplate.boundValueOps("string").set("萧萧");//存储System.out.println(redisTemplate.opsForValue().get("string"));//查询//散列redisTemplate.boundHashOps("user").put("name","雪蝶梨");//存储redisTemplate.boundHashOps("user").put("age",14);Set keys = redisTemplate.boundHashOps("user").keys();System.out.println("散列所有的键是"+keys);List values = redisTemplate.boundHashOps("user").values();System.out.println("散列所有的值是"+values);//List列表redisTemplate.boundListOps("myList").leftPush("c");//存储redisTemplate.boundListOps("myList").leftPush("b");redisTemplate.boundListOps("myList").leftPush("a");List myList = redisTemplate.boundListOps("myList").range(0, -1);//查询System.out.println(myList);//set集合redisTemplate.boundSetOps("mySet").add("a","b","c");//存储Set mySet = redisTemplate.boundSetOps("mySet").members();//查询System.out.println(mySet);//sorted set集合redisTemplate.boundZSetOps("my_sorted_set").add("a",10);//存储redisTemplate.boundZSetOps("my_sorted_set").add("b",20);redisTemplate.boundZSetOps("my_sorted_set").add("c",30);Set my_sorted_set = redisTemplate.boundZSetOps("my_sorted_set").range(0, -1);//查询System.out.println(my_sorted_set);}
}