1.介绍Jedis
Jedis 是 Redis 的 java 版本客户端,使用Jedis可以连接 Redis的数据库,Jedis连接方式有三种Jedis/JedisPool 连接、ShardedJedis/ShardedJedisPool 连接、JedisCluster 连接,今天主要讲解用 Java 代码连接 Jedis 连接池
1.1连接Jedis/JedisPool
首先在Redis 中加入username 如图
下面是连接Jedis的具体过程
public class JedisTest { //通过java程序访问redis数据库 @Test //获得单一的jedis对象操作数据库 public void test1() { //1.获得连接对象 Jedis jedis = new Jedis("192.168.199.2", 6379); //2.获取数据 String username = jedis.get("username"); System.out.println(username); //3.存储 jedis.set("addr", "北京"); System.out.println(jedis.get("addr")); }
//结果zhr
北京
//通过jedis的pool获得jedis连接对象 @Test public void test2() { //0.创建池子的配置对象 JedisPoolConfig poolconfig = new JedisPoolConfig(); poolconfig.setMaxIdle(30);//最大闲置个数 poolconfig.setMinIdle(10);//最小闲置个数 poolconfig.setMaxTotal(50);//最大连接数 //1.创建一个redis的连接池 JedisPool pool = new JedisPool(poolconfig,"192.168.199.2", 6379); //2.从池子中获取redis的连接资源 Jedis jedis = pool.getResource(); //3.操作数据库 jedis.set("haha","123"); System.out.println(jedis.get("haha")); //4.关闭资源 jedis.close(); pool.close(); } }
//123
1.2封装JedisPool工具
新建一个 redis.properties
redis.maxIdle=30 redis.minIdle=10 redis.maxTotal=100 redis.url=192.168.199.2 redis.port=6379
创建一个 JedisPoolUtils 工具方便以后开发使用
package com.zhr.jedis; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class JedisPoolUtils { private static JedisPool pool; static { //加载配置文件 InputStream in = JedisPoolUtils.class.getClassLoader().getResourceAsStream("redis.properties"); Properties pro = new Properties(); try { pro.load(in); } catch (IOException e) { 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(); } public static void main(String[] args) { Jedis jedis = getJedis(); System.out.println(jedis.get("haha")); } }
如果出现 JedisConnectionException 这个异常的小朋友问题在于没有把防火墙打开
- 值得注意的问题是要使用Jedis需要开放端口 Centos7 开放的代码是
firewall-cmd --zone=public --add-port=6379/tcp --permanent
- Centos7以下开放的代码是
/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
/etc/rc.d/init.d/iptables save
2.Redis 数据结构及常用命令
Redis一共有五种数据类型如下
- 字符型(String)
- 哈希(hash)
- 字符串列表(list)
- 字符串集合(set)
- 有序字符串集合(sorted set)
Redis 还是一种高级的 key-valu e的存储系统,所以对于key不要定义太长,不要超过1024字节,这样消耗内存而且还降低查询效率
2.1字符型String
字符型类型在 Redis 中采用二进制,这说明该类型存入和获取的数据相同。在 Redis 中字符串类型的 Value 最多可以容纳数据长度是512M
-
赋值: set key value
- 取值:get key/getset key value
- 删除:del key
- 数值自增和自减: incr key/decr key
- 为key增加一个指定数值: incrby key increment
- 为key减少一个指定数值: decrby key decrement
- 拼凑字符串: append key value
具体操作如图
这里我们需要注意的是getset key value这个命令和get key 这两个命令的区别,前者是先获取然后在重新设置返回的结果是获取的结果也就是图片出现的“lihai”实际已经赋值为5,incr、decr一个是自增、一个是自减、append key value 这个命令是在后面追加字符串返回的是字符串的结果,最后我们删除del key因为已经没有了再次get的时候就会nil为空
2.2哈希hash
Redis 中 Hash 类型可以看作是 map 的容器,所以该类型非常适合存储对象的信息。
- 赋值: hset key field value 为指定的key设置field/value对
- 赋值: hmset key field value [field2 value2...] 设置key中多个filed/value
- 取值: hget key field
- 取值: hmget key fileds 获取 key 中的多个filed 的值
- 取值: hgetall key 获取 key 中所有的 filed-value
- 删除: hdel key field[field...] 可以删除一个或多个字段,返回值是被删除的字段个数
- 删除 del key 删除整个list
- 增加数字: hincrby key field increment 设置key 中 filed 的值增加 increment
- 是否存在: hexists key field 判断指定 key 中的 filed 是否存在
- field的数量: hlen key 获取 key 所包含的 field 的数量
- 获得所有的key :hkeys key
- 获得所有的value :hvals key
具体操作如图
这里需要注意的是增加数字increment 可以是正数和负数
2.3字符串列表list
在 Redis 中的 list 类型实际相当于双向链表结构,可以在头部(left)和尾部(right)添加新元素,在插入时,如果该键并不存在,Redis 会自动创建一个新的链表,如果链表中的元素全部被移除,那么该键也会被从数据库中删除,从元素插入和删除的效率来看,在链表的两头插入和删除元素,这样的操作效率是非常高的。
- 头部插入:lpush key values[value1 value2...] 在指定的key所在头部插入所有的values,如果该 key 不存在,该命令在插入之前会创建一个与该 key 关联的空链表。插入成功,返回元素的个数
- 尾部插入:rpush key values[value1 value2...]
- 获得链表中从start 到 end元素的值:lrange key start end 若为-1则表示链表尾部元素,-2为倒数第二个
- 头部弹出:lpop key 返回并弹出指定的key 关联的链表中第一个元素,如果key 不存在 返回nil
- 尾部弹出:rpop key
- 获得列表中元素格式:llen key
- lpushx key value:当参数中指定的 key 存在时,向关联的list的头部插入 value。如果不存在,将不进行插入
- rpushx key value:在该list的尾部添加
- lrem key cont value :删除 coount 个值为 value 的元素,如果count大于0,从头到尾遍历并删除,如果count 小于0,则从尾向头遍历并删除。如果 count 等于0,则删除链表中所有等于value 的元素
- lset key index value :设置链表中的index 的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。角标不存在则抛异常
- linsert key before|after pivot value :在 pivot 元素前或者后插入 value 这个元素
- rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部(循环操作)
2.4字符串集合Set
在Redis 中,可以将 Set 类型看作为没有排序的字符集合,Set 集合中不允许出现重复的元素
- sadd key values[value1 value2...]:向 set 中添加数据,如果该 key 的值已有则不会重复添加
- srem key members[member1 member2...]:删除 set 中指定的成员
- smembers key:获得 set 中所有的成员
- sismember key member:判断参数中指定的成员是否在该 set 中,1表示存在,0表示不存在或key本身不存在
- sdiff key1 key2...:返回 key1 与 key2 中相差的成员,而且与key的顺序有关。即返回差集。(A-B)
- sinter key1 key2 key3...:返回交集(A∩B)
- sunion key1 key2 key3...:返回并集(A∪B)
- scard key:获取 set 中成员的数量
- srandmember key:随机返回 set 中的一个成员
- sdiffsotre destination key1 key2...:将key1、key2相差的成员存储在destination 上
- sintersotre destination key[key...]:将返回的交集存储在 destination上
- sunionstore destination key[key...]:将返回的并集存储在 destination 上
使用 Set 的时候要注意它的唯一性,比如用户的ID 就是唯一的可以存放在Set 当中
2.5有序字符串集合Sorted Set
Sorted Set 和 Set极为相似,他们都是字符串集合,都不允许重复的成员出现在一个 Set中。它们之间主要的差别是 Sorted Set 中每一个成员都会有一个分数(score)与之关联我们称它为权重,Redis 也正是通过这个分数来进行从小到大的排序,要注意的是成员必须是唯一的,但分数是可以重复的。使用场景为游戏排名、微博热点话题等
- zadd key score member score2 member2...:将所有成员以及该成员的分数存放到sorted set 中,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素
- zscore key member:返回指定成员分数
- zcard key:获取集合中的成员数量
- zrem key member[member...]:移除集合中指定的成员,可以指定多个成员
- zrange key start end [withscores]:获得集合中脚标为start-end 的成员,[withscores]参数表明返回的成员包含其分数
- zrevrange key start stop [withscores]:照元素分数从大到小的顺序返回索引从start 到 stop之间的所有元素(包括两端的元素)
- zremrangebyrank key start stop:按照排名范围删除元素
- zremrangebyscore key min max:按照分数范围删除元素
- zrangebyscore key min max [withscores] [limit offset count]:返回分数在[min,max]的成员并按照分数从低到高排序。[withscores]:显示分数:[limit offset count]:offset,表明从角标为offset的元素开始并返回count个成员
- zincrby key increment member:设置指定成员的增加分数。返回值是更改后的分数
- zcount key min max:获取分数在[min,max]之间的成员
- zrank key menber:返回成员在集合中的排名(从小到大)
- zrevrank key member:返回成员在集合中的排名(从大到小)
有些不常用的到时候就来这里面查找就好了 请忽略手残打错字
3.keys通用操作
- keys pattern:获取所有与pattern匹配的key,返回所有与该key匹配的。 *表示任意或一个或多个字符,?表示任意一个字符
- del key1 key2...:删除指定的key
- exists key:判断该key 是否存在,1代表存在,0代表不存在
- rename key newkey:为当前的key重命名
- expire key:设置过期时间,单位:秒
- ttl key:获取该key 所剩的超时时间,如果没有设置超时,返回-1.如果返回-2 表示超时不存在
- type key:获取指定 key 的类型。该命令将以字符串的格式返回。返回字符串为 string、list、set、hash、zshet,如果 key 不存在返回none
4.Redis特性
一、Redis有多数据库一共16个,下标从0到15,客户端默认连接第0号数据库,可以通过select选择连接那个数据库
- select num:切换数据库
- move newkey 1:将当前库的key移植到1号库中
- ping :测试连接是否还存活 PONG为存活
- echo:在命令行打印一些内容
- quit:退出连接
- dbsize:返回当前数据库中 key 的数目
- info:获取服务器的信息和统计
- flushdb:删除当前选择数据库中的所有 key
- flushall:删除所有数据库中的所有 key
二、消息订阅与发布
- subscribe channel:订阅频道 eg:subscribe chat
- psubscribe channel*:批量订阅频道 eg:psubscribe z*,订阅z开头的频道
- publish channel content:在指定频道中发布消息,eg:publish chat 'haha'
三、事务
在事务执行期间,Redis 不会在为其它客户端的请求提供任何服务,从而保证了事务中的所有命令被原子的执行,和关系型数据库中的事务相比,在Redis 事务中如果有某一条命令执行失败,其后的命令仍然会被继续执行,在Redis中有三个事务的命令如下
- multi:开启事务用于标记事务的开始,其后执行的命令都将被存入命令队列,直到执行 exec 时,这些命令才会被原子的执行,类似与关系型数据库中的:begin transaction
- exec:提交事务,类似与关系型数据库中的:commit
- discard:事务回滚,类似与关系型数据库中的:rollback