本文共 6235 字,大约阅读时间需要 20 分钟。
Redis是一个开源的使用ANSI 编写、支持网络、可基于内存亦可持久化的日志型、Key-Value,并提供多种语言的API。
在项目中使用redis,主要是从两个角度去考虑:性能和并发。
性能:我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。
并发:在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。
String:key-value(做缓存)
Redis中所有的数据都是字符串。命令不区分大小写,key是区分大小写的。Redis是单线程的。Redis中不适合保存内容大的数据。
get、set
incr:加一(生成id)
Decr:减一
Hash:key-fields-values(做缓存)
相当于一个key对于一个map,map中还有key-value
使用hash对key进行归类。
Hset:向hash中添加内容
Hget:从hash中取内容
List:有顺序可重复
常用命令如下:
192.168.25.153:6379> lpush list1 a b c d(integer) 4192.168.25.153:6379> lrange list1 0 -11) "d"2) "c"3) "b"4) "a"192.168.25.153:6379> rpush list1 1 2 3 4(integer) 8192.168.25.153:6379> lrange list1 0 -11) "d"2) "c"3) "b"4) "a"5) "1"6) "2"7) "3"8) "4"192.168.25.153:6379>192.168.25.153:6379> lpop list1"d"192.168.25.153:6379> lrange list1 0 -11) "c"2) "b"3) "a"4) "1"5) "2"6) "3"7) "4"192.168.25.153:6379> rpop list1"4"192.168.25.153:6379> lrange list1 0 -11) "c"2) "b"3) "a"4) "1"5) "2"6) "3"192.168.25.153:6379>
Set:元素无顺序,不能重复
常用命令如下:
192.168.25.153:6379> sadd set1 a b c c c d(integer) 4192.168.25.153:6379> smembers set11) "b"2) "c"3) "d"4) "a"192.168.25.153:6379> srem set1 a(integer) 1192.168.25.153:6379> smembers set11) "b"2) "c"3) "d"192.168.25.153:6379>
SortedSet(zset):有顺序,不能重复
常用命令如下:
192.168.25.153:6379> zadd zset1 2 a 5 b 1 c 6 d(integer) 4192.168.25.153:6379> zrange zset1 0 -11) "c"2) "a"3) "b"4) "d"192.168.25.153:6379> zrem zset1 a(integer) 1192.168.25.153:6379> zrange zset1 0 -11) "c"2) "b"3) "d"192.168.25.153:6379> zrevrange zset1 0 -11) "d"2) "b"3) "c"192.168.25.153:6379> zrange zset1 0 -1 withscores1) "c"2) "1"3) "b"4) "5"5) "d"6) "6"192.168.25.153:6379> zrevrange zset1 0 -1 withscores1) "d"2) "6"3) "b"4) "5"5) "c"6) "1"192.168.25.153:6379>
设置key的过期时间。
Expire key second:设置key的过期时间
Ttl key:查看key的有效期
Persist key:清除key的过期时间。Key持久化。
192.168.25.153:6379> expire Hello 100(integer) 1192.168.25.153:6379> ttl Hello(integer) 77
常用的操作redis的方法提取出一个接口,分别对应单机版和集群版创建两个实现类。
public interface JedisClient { String set(String key, String value); String get(String key); Boolean exists(String key); Long expire(String key, int seconds); Long ttl(String key); Long incr(String key); Long hset(String key, String field, String value); String hget(String key, String field); Long hdel(String key, String... field);}
public class JedisClientPool implements JedisClient { @Autowired private JedisPool jedisPool; @Override public String set(String key, String value) { Jedis jedis = jedisPool.getResource(); String result = jedis.set(key, value); jedis.close(); return result; } @Override public String get(String key) { Jedis jedis = jedisPool.getResource(); String result = jedis.get(key); jedis.close(); return result; } @Override public Boolean exists(String key) { Jedis jedis = jedisPool.getResource(); Boolean result = jedis.exists(key); jedis.close(); return result; } @Override public Long expire(String key, int seconds) { Jedis jedis = jedisPool.getResource(); Long result = jedis.expire(key, seconds); jedis.close(); return result; } @Override public Long ttl(String key) { Jedis jedis = jedisPool.getResource(); Long result = jedis.ttl(key); jedis.close(); return result; } @Override public Long incr(String key) { Jedis jedis = jedisPool.getResource(); Long result = jedis.incr(key); jedis.close(); return result; } @Override public Long hset(String key, String field, String value) { Jedis jedis = jedisPool.getResource(); Long result = jedis.hset(key, field, value); jedis.close(); return result; } @Override public String hget(String key, String field) { Jedis jedis = jedisPool.getResource(); String result = jedis.hget(key, field); jedis.close(); return result; } @Override public Long hdel(String key, String... field) { Jedis jedis = jedisPool.getResource(); Long result = jedis.hdel(key, field); jedis.close(); return result; } }
配置:applicationContext-redis.xml
package com.taotao.jedis;import org.springframework.beans.factory.annotation.Autowired;import redis.clients.jedis.JedisCluster;public class JedisClientCluster implements JedisClient { @Autowired private JedisCluster jedisCluster; @Override public String set(String key, String value) { return jedisCluster.set(key, value); } @Override public String get(String key) { return jedisCluster.get(key); } @Override public Boolean exists(String key) { return jedisCluster.exists(key); } @Override public Long expire(String key, int seconds) { return jedisCluster.expire(key, seconds); } @Override public Long ttl(String key) { return jedisCluster.ttl(key); } @Override public Long incr(String key) { return jedisCluster.incr(key); } @Override public Long hset(String key, String field, String value) { return jedisCluster.hset(key, field, value); } @Override public String hget(String key, String field) { return jedisCluster.hget(key, field); } @Override public Long hdel(String key, String... field) { return jedisCluster.hdel(key, field); }}
Spring的配置:
注意:单机版和集群版不能共存,使用单机版时注释集群版的配置。使用集群版,把单机版注释。
@Testpublic void testJedisClientPool() throws Exception { //初始化spring容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-redis.xml"); //从容器中获得JedisClient对象 JedisClient jedisClient = applicationContext.getBean(JedisClient.class); //使用JedisClient对象操作redis jedisClient.set("jedisclient", "mytest"); String result = jedisClient.get("jedisclient"); System.out.println(result);}
转载于:https://blog.51cto.com/13477015/2335617