关于关系型数据库和nosql数据库
关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据库是基于特殊的结构,并将数据存储到内存的数据库,也能进行持久化操作。从性能上而言,nosql数据库 要优于关系型数据库,从安全性上而言关系型数据库要优于nosql数据库,所以在实际开发中一个项目中nosql和关系型数据库会一起使用,达到性能和安全性的双保证。
redis是一种高级的key-value的存储系统
其中的key是字符串类型,尽可能满足如下几点:
- key不要太长,最好不要操作1024个字节,这不仅会消耗内存还会降低查找效率
- key不要太短,如果太短会降低key的可读性
- 在项目中,key最好有一个统一的命名规范(根据企业的需求)
其中value 支持五种数据类型:
- 字符串型 string
- 字符串列表 lists
- 字符串集合 sets
- 有序字符串集合 sorted sets
- 哈希类型 hashs
前端启动:
Last login: Fri Jul 20 18:46:39 2018 from 127.0.0.1
root@shu-quan:~# cd /usr/local/share/application/redis
root@shu-quan:/usr/local/share/application/redis# ls
bin redis-3.0.0 redis-3.0.0.tar.gz
root@shu-quan:/usr/local/share/application/redis# cd bin/
root@shu-quan:/usr/local/share/application/redis/bin# ls
redis-benchmark redis-check-dump redis-sentinel
redis-check-aof redis-cli redis-server
root@shu-quan:/usr/local/share/application/redis/bin# ./redis-cli
127.0.0.1:6379> set username zhangsan
127.0.0.1:6379> set username zhangsan
OK
127.0.0.1:6379> get user
(nil)
127.0.0.1:6379> get username
"zhangsan"
127.0.0.1:6379>
root@shu-quan:/usr/local/share/application/redis/redis-3.0.0# ls 00-RELEASENOTES COPYING Makefile redis.conf runtest-sentinel tests BUGS deps MANIFESTO runtest sentinel.conf utils CONTRIBUTING INSTALL README runtest-cluster src root@shu-quan:/usr/local/share/application/redis/redis-3.0.0# cd ../ root@shu-quan:/usr/local/share/application/redis# ll 总用量 1344 drwxr-xr-x 4 root root 4096 7月 20 19:31 ./ drwxr-xr-x 4 root root 4096 7月 20 19:08 ../ drwxr-xr-x 2 root root 4096 7月 20 19:31 bin/ drwxrwxr-x 6 root root 4096 4月 1 2015 redis-3.0.0/ -rw-r--r-- 1 root root 1358081 5月 14 2015 redis-3.0.0.tar.gz root@shu-quan:/usr/local/share/application/redis# cd bin/ root@shu-quan:/usr/local/share/application/redis/bin# ls redis-benchmark redis-check-dump redis-sentinel redis-check-aof redis-cli redis-server root@shu-quan:/usr/local/share/application/redis/bin# sudo redis-server sudo: redis-server:找不到命令 root@shu-quan:/usr/local/share/application/redis/bin# ./redis-server 8303:C 20 Jul 19:37:40.820 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf 8303:M 20 Jul 19:37:40.821 * Increased maximum number of open files to 10032 (it was originally set to 1024). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.0.0 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 8303 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-'
|
后台启动与关闭:
Redis的入门:
//1、获得连接对象 Jedis jedis = new Jedis("111.186.103.100", 6379); //2、获得数据 String username = jedis.get("username"); System.out.println(username);
//3、存储 jedis.set("addr", "北京"); System.out.println(jedis.get("addr")); |
通过jedis的pool获得jedis的连接对象:
public void test2(){ //0、创建池子的配置对象 JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxIdle(30);//最大闲置个数 poolConfig.setMinIdle(10);//最小闲置个数 poolConfig.setMaxTotal(50);//最大连接数
//1、创建一个redis的连接池 JedisPool pool = new JedisPool(poolConfig, "111.186.103.100", 6379); //2、从池子中获取redis的连接资源 Jedis jedis = pool.getResource();
//3、操作数据库,json很典型 jedis.set("xxx","yyyy"); System.out.println(jedis.get("xxx"));
//4、关闭资源 jedis.close(); pool.close();//真正开发不关池子 } |
Spring Data Redis 为四种Redis客户端实现提供了连接工厂:
1 JedisConnectionFactory
@Bean
public RedisConnectionFactory redisCF(){
JedisConnectionFactory cf = new JedisConnnectionFactory();
cf.setHostName("redis-server");
cf.setPort(7393);
cf.setPassword("xxxxxx");
return cf;
}
2 JredisConnectionFactory
3 LettuceConnectionFactory
4 SrpConnectionFactory
所有的Redis连接工厂都具有setHostName()、setPort()和setPassword()方法。
使用Redis连接工厂可以生成连接(RedisConnection)。RedisConnection conn = cf.getConnection();
conn.set("xx".getBytes(),"ss".getBytes());字节数组很麻烦的。所以,Spring Data Redis以模板的形式提供了更高级的数据访问方案。RedisTemplate和StringRedisTemplate
RedisConnectionFactory cf =.....
RedisTemplate<String,Product> redis = new RedisTemplate<String,Product>();
redis.setConnectionFactory(cf); // 注意RedisTemplate使用了两个类型进行参数化。
那么,如果使用的key和value都是String类型,可以使用StringRedisTemplate.
RedisConnectionFactory cf =.....
StringRedisTemplate redis = new StringRedisTemplate(cf); //StringRedisTemplate模板有一个接受RedisConnectionFactory的构造器,因此没有要构建后在调用setConnectionFactory
常用的操作:
使用RedisTemplate<String,Product>
redis.opsForValue().set(product.getId(),product); //根据id作为key保存
Product product = redis.opsForValue().get("123456");//根据id查询产品
在List上进行操作
redis.opsForList().rightPush("cart",product);//从尾部添加一个产品
redis.opsForList().leftPush("cart",product);//从头部添加一个产品
Product product = redis.opsForList().leftPop("cart");//从头部弹出一个元素
Product product = redis.opsForList().rightPop("cart");//从尾部弹出一个元素
Product product = redis.opsForList().range("cart",2,6);//从列表中间获取
在Set上进行操作
redis.opsForSet().add("cart",product);//添加一个元素
Set<Product> list = redis.opsForSet.difference("cart1","cart2");//求差
Set<Product> list = redis.opsForSet.union("cart1","cart2");//求交集
Set<Product> list = redis.opsForSet.isect("cart1","cart2");//求并集
redis.opsForSet.remove("product");//删除一个元素
Product random = redis.opsForSet.randomMember("cart1");//随机获取一个元素
绑定到某个key上:使用BoundXxxOperations
总结:基于Spring Data 的JPA的应用,Spring Data MongoDB和Spring Data Neo4j提供了基于接口定义的自动生成 repository的功能,分别应用在MongoDB文档数据库和Neo4j图数据库。Spring Data Redis提供了两个不同的模板来操作redis数据库。