Redis应用
一、Redis的数据结构
1.redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构
1)字符串类型 string
2) 哈希类型 hash : map格式
3) 列表类型 list : linkedlist格式。支持重复元素
4) 集合类型 set : 不允许重复元素
5) 有序集合类型 sortedset:不允许重复元素,且元素有顺序
2.存储字符串string
1)set key value :设定key持有指定的字符串value,如果该key存在则进行覆盖操作
2) get key:获取key的value。如果与该key关联的value不是String类型,redis将返回错误信息,因为get命令只能用于获取String类型的值;如果该key不存在,返 回null。
3)getset key value:先获取该key的值,然后在设置该key的值。
4)incr key:将指定的key的value原子性的递增1,如果该key不存在,其初始值 为0
decr key:将指定的key的value原子性的递减1.如果该key不存在,其初始值 为0
5)incrby key increment:将指定的key的value原子性增加increment
decrby key decrement:将指定的key的value原子性减少decrement
6)append key value:如果该key存在,则在原有的value后追加该值,如果该key 不存在,则重新创建一个key/value。
2.存储list类型
1).概念:
List类型是按照插入顺序排序的字符串链表
2)lpush key value1 value2...:在指定的key所关联的list的头部插入所有的values。如果该key不存在则创建
rpush key value1、value2…:在该list的尾部添加元素
lrange key start end:获取链表中从start到end的元素的值;start、end可为负数,若为-1则表示链表尾部的元素,-2则表示倒数第二个....
3)lpop key:返回并弹出指定的key关联的链表中的第一个元素。
4)rpop key:从尾部弹出元素。
5)llen key:返回指定的key关联的链表中的元素的数量。
6)lset key index value:设置链表中的index的脚标的元素值,0代表链表的头元 素,-1代表链表的尾元素。
7)linsert key before|after pivot value:在pivot元素前或者后插入value这个元素。
3.存储set类型
1)在Redis中,Set类型看作为没有排序的字符集合并且Set集合中不允许出现重复的元素
2)sadd key value1、value2…:向set中添加数据,如果该key的值已有则不会重复添加
3)smembers key:获取set中所有的成员
4)scard key:获取set中成员的数量
5)sismember key member:判断参数中指定的成员是否在该set中,1表示存在,0表示不存在或者该key本身就不存在
6)srem key member1、member2…:删除set中指定的成员
4.存储sortedset
1)不允许重复元素,且元素有顺序;
2) zadd key score value:将所有成员以及该成员的分数存放到sorted-set中
3)zcard key:获取集合中的成员数量
4)zcount key min max:获取分数在[min,max]之间的成员
5)zrange key start end :zrange mysort 0 -1
5.哈希类型 hash
1) 存储:hset key field value -------------->hset myhash username lisi
2) 获取:hget key field: 获取指定的field对应的值
hgetall key:获取所有的field和value
3) 删除: hdel key field
二、持久化
1. redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
2.redis持久化机制:
1) RDB:默认方式,不需要进行配置,默认就使用这种机制
* 在一定的间隔时间中,检测key的变化情况,然后持久化数据
- 编辑redis.windwos.conf文件;
- 重新启动redis服务器,并指定配置文件名称;
2)AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据 (不推荐使用)
* 编辑redis.windwos.conf文件:
ppendonly no(关闭aof) --> appendonly yes (开启aof)
# appendfsync always : 每一次操作都进行持久化
appendfsync everysec : 每隔一秒进行一次持久化
# appendfsync no : 不进行持久化
三、Java客户端Jedis
* Jedis: 一款java操作redis数据库的工具;
* 使用步骤:1. 下载jedis的jar包
2. 使用:
//通过Java代码驱动jedis @Test //获得单一的jedis对象操作数据 public void test1() { //1.获得连接对象 Jedis jedis =new Jedis("自己的虚拟机地址", 6379); //2.获得数据 String username = jedis.get("username"); System.out.println(username); //3.存储数据 jedis.set("addr","北京"); System.out.println(jedis.get("addr")); }
* Jedis操作各种redis中的数据
1) 字符串类型 string
//2. 操作 //存储 jedis.set("username","zhangsan"); //获取 String username = jedis.get("username"); System.out.println(username); //可以使用setex()方法存储可以指定过期时间的 key value jedis.setex("activecode",20,"hehe");//将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对 //3. 关闭连接 jedis.close();
2) 哈希类型 hash : map格式
//2. 操作 // 存储hash jedis.hset("user","name","lisi"); jedis.hset("user","age","23"); jedis.hset("user","gender","female"); // 获取hash String name = jedis.hget("user", "name"); System.out.println(name); // 获取hash的所有map中的数据 Map<String, String> user = jedis.hgetAll("user"); // keyset Set<String> keySet = user.keySet(); for (String key : keySet) { //获取value String value = user.get(key); System.out.println(key + ":" + value); }
3) 列表类型 list : linkedlist格式。支持重复元素
//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");//c String element2 = jedis.rpop("mylist");//c // list 范围获取 List<String> mylist2 = jedis.lrange("mylist", 0, -1);
4) 集合类型 set : 不允许重复元素
// set 存储 jedis.sadd("myset","java","php","c++"); // set 获取 Set<String> myset = jedis.smembers("myset");
5) 有序集合类型 sortedset:不允许重复元素,且元素有顺序
// sortedset 存储 jedis.zadd("mysortedset",3,"亚瑟"); jedis.zadd("mysortedset",30,"后裔"); jedis.zadd("mysortedset",55,"孙悟空"); // sortedset 获取 Set<String> mysortedset = jedis.zrange("mysortedset", 0, -1);
Redis连接池工具类:
public class JedisPoolUtils { private static JedisPool pool =null; static { //获得配置文件 InputStream in = JedisPoolUtils.class.getClassLoader().getResourceAsStream("redis.properties"); Properties pro =new Properties(); try { pro.load(in); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //获得池子对象 JedisPoolConfig poolconfig =new JedisPoolConfig(); poolconfig.setMaxIdle(Integer.parseInt(pro.get("redis.MaxIdle").toString()));//最大闲置个数 poolconfig.setMinIdle(Integer.parseInt(pro.get("redis.MinIdle").toString()));//最小闲置个数 poolconfig.setMaxTotal(Integer.parseInt(pro.get("redis.MaxTotal").toString()));//最大连接数 pool =new JedisPool(poolconfig,pro.getProperty("redis.url"),Integer.parseInt(pro.get("redis.port").toString())); } //获得Jedis资源 public static Jedis getJedis() { return pool.getResource(); } }
//redis.properties文件 redis.MaxIdle=30 redis.MinIdle=10 redis.MaxTotal=100 redis.url=虚拟机地址 redis.port=6379