十、Redis
1、概念
-
redis是一款高性能的NOSQL系列的非关系型数据库
-
什么是NoSQL?
- NOSQL=No Only SQL,是一项全新的数据库概念,反之非关系型数据库,解决大规模数据集合多重数据种类带来的挑战
-
NOSQL和关系数据库的比较
- 优点:
- 成本:nosql数据库简单部署,基本都是开源软件
- 查询速度:nosql数据库将数据存储于内存中,关系型数据库将数据存储在硬盘中
- 存储数据格式:nosql是key,value形式、文档、图片形式等多种形式,关系型数据库只支持基础类型
- 扩展性:关系型数据库有类似join这样的表查询机制的限制导致很难扩展
- 缺点:
- 维护工具和资料有限
- 不提供对sql的支持,有一定的学习和使用成本
- 部分nosql数据库不支持事务的处理
- 总结:关系型数据库和非关系型数据库并非对立而是互补的关系,nosql数据库弥补关系型数据库的不足
- 优点:
-
Redis支持的键值数据类型:
数据类型 解释 字符串 String 相当于java中的String 哈希类型 hash 相当于java中的Map 列表类型 list 相当于java中的LinkedList,支持重复元素 集合类型 set 相当于java中的set,不支持重复元素 有序集合类型 sortedset(zset) 相当于java中的treeset,不支持重复元素,元素有顺序
2、命令操作
- 字符串类型 string
- 存储字符串
- set key value
- 获取字符串
- get key
- 删除字符串
- del key
- 存储字符串
- 哈希类型 hash
- 存储
- hset key field value
- 获取
- hget key field : 获取指定field对应的值
- hgetall key : 获取key对应的所有field和value
- 删除
- hdel key field
- 存储
- 列表类型 list
- 添加
- lpush key value : 将元素从列表左边加入进去
- rpush key value : 将元素从列表右边加入进去
- 获取
- lrange key start end : 获取范围,若获取全部,end可以使用-1指定
- 删除
- lpop key : 删除列表最左边元素,并将元素返回
- rpop key : 删除列表最右边元素,并将元素返回
- 添加
- 集合类型 set
- 添加
- sadd key value
- 获取
- smembers key : 获取set集合中的所有元素
- 删除
- srem key value : 删除set集合中的某个元素
- 添加
- 有序集合类型 sortedset(zset)
- 存储
- zadd key score value : 指定一个score是排序的依据,score取绝对值
- 获取
- zrange key start end
- 删除
- zrem key value
- 存储
- 通用的命令
- keys * : 查询所有的键
- type key : 获取键对应的value的类型
- del key : 删除指定的 key value
3、redis的持久化机制
-
redis是一个内存数据库,若redis服务器重启,或者电脑重启,数据会丢失,我们可以将redis中的数据持久化保存到硬盘文件中
-
redis的持久化机制
-
RDB: 默认方式,在一定的时间间隔内,检测key的变化情况,然后持久化数据
-
编辑redis.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
-
配置后重启redis服务器,并指定配置文件名称
redis-server.exe redis.windows.conf
-
-
AOF: 日志记录的方式,可以记录每一条命令的操作,持久化数据,效率低
-
编辑redis.window.conf文件
appendonly no (关闭aof) ---> appendonly yes(开启aof) # appendfsync always :每一次操作都进行持久化 appendfsync everysec : 每隔一秒进行一次持久化 # appendfsync no :不进行持久化
-
配置后重启redis服务器,并指定配置文件名称
redis-server.exe redis.windows.conf
-
-
4、Jedis
-
概念:java操作redis数据库的工具
-
Jedis操作redis中的数据结构
-
字符串类型 String
//1.获取连接 Jedis jedis = new Jedis("127.0.0.1", 6379);//使用无参构造器时,默认连接的是本机 //2.操作 //String set(String key,String value) 返回值没用 String username = jedis.set("username", "张三"); System.out.println(username); //String setex(String key,int seconds,String value) 存储多少秒后自动消失的键值对 String setex = jedis.setex("time", 20, "消失");//20秒后自动消失 System.out.println(setex);//都是ok //String get(String key) 返回的是键对应的值 String name = jedis.get("username"); System.out.println(name); //Long del(String...args) 通过键删除键值对 Long del = jedis.del("username"); System.out.println(del); //3.归还连接 jedis.close();
-
哈希类型 hash Map类型
//1.获取连接 Jedis jedis = new Jedis(); //Long hset(String key,String field,String value) : 返回值为影响的行数 jedis.hset("user", "name", "张三"); jedis.hset("user", "age", "12"); jedis.hset("user", "sex", "woman"); //String hget(String key,String field) : 返回值为value String value = jedis.hget("user", "name"); System.out.println(value); //Map<String,String> hgetAll(String key) : 返回值为Map Map<String, String> map = jedis.hgetAll("user"); Set<String> keySet = map.keySet(); for (String key : keySet) { String val = map.get(key); System.out.println(key + "---" + val); } //3.释放连接 jedis.close();
-
列表类型 List
//1.获取连接 Jedis jedis = new Jedis(); //2.操作 //Long lpush(String key,String...args) : 返回值影响的行数 从左边插入数据 //Long rpush(String key,String...args) : 从右边插入数据 Long lpush = jedis.lpush("mylist", "a", "b", "c"); Long rpush = jedis.rpush("mylist", "a", "b", "c"); //String lpop(String key) : 返回值:被删除的value值 删除列表左边第一个元素 //String rpop(String key) : 返回值:被删除的value值 删除列表右边第一个元素 String lpop = jedis.lpop("mylist"); String rpop = jedis.rpop("mylist"); System.out.println(lpop); System.out.println(rpop); //List<String> lrange(String key,int start,int end) 获取指定范围的list集合 List<String> mylist = jedis.lrange("mylist", 0, -1); System.out.println(mylist); //3.释放连接 jedis.close();
-
集合类型set
//1.获取连接 Jedis jedis = new Jedis("localhost", 6379); //2.操作 //Long sadd(String key,String...args) : 添加数据 Long sadd = jedis.sadd("myset", "张三", "李四"); //Set<String> smembers(String key) : 获取数据 Set<String> myset = jedis.smembers("myset"); System.out.println(myset); //3.释放连接 jedis.close();
-
有序集合类型sortedset zset
//1.获取连接 Jedis jedis = new Jedis(); //2.操作 //Long zadd(String key,double score,String member) : 添加数据 Long zadd = jedis.zadd("myzset", 10, "张三"); Long zadd1 = jedis.zadd("myzset", 10, "李四"); Long zadd2 = jedis.zadd("myzset", 20, "张三");//会将前面的张三覆盖 //Set<String> zrange(String key,int start,int end) : 获取指定返回的数据 Set<String> myzset = jedis.zrange("myzset", 0, -1); System.out.println(myzset); //3.释放连接 jedis.close();
-
5、Jedis连接池
-
使用:
- 创建JedisPool连接池对象
- 调用方法getResource() 方法获取Jedis连接
- 配置JedisPool可使用JedisPoolConfig类
-
Jedis连接池的工具类JedisUtils
public class JedisUtils { private static JedisPool jedisPool; static { //1.读取配置文件 Properties prop = null; try { prop = new Properties(); ClassLoader loader = JedisUtils.class.getClassLoader(); InputStream ras = loader.getResourceAsStream("jedis.properties"); prop.load(ras); } catch (IOException e) { e.printStackTrace(); } //2.获取数据设置到JedisPoolConfig中 String host = prop.getProperty("host"); int port = Integer.parseInt(prop.getProperty("port")); int maxTotal = Integer.parseInt(prop.getProperty("maxTotal")); int maxIdle = Integer.parseInt(prop.getProperty("maxIdle")); JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(maxTotal); config.setMaxIdle(maxIdle); //3.初始化JedisPool jedisPool = new JedisPool(config,host,port); } /** * 获取Jedis连接 * @return */ public static Jedis getJedis(){ return jedisPool.getResource(); } }