redis属于NoSql分类,它把数据都是缓存在内存中的,我们都知道内存的读写效率跟硬盘不是一个级别的,最后redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。既然用redis读取效率那么高,最后内容也会添加到磁盘那么我们就当然要使用它了。
下载安装Redis
打开Redis服务配置文件。注意:不要找错了,通常为redis.windows-service.conf,而不是redis.windows.conf。
找到含有requirepass字样的地方,追加一行,输入requirepass 12345。这是访问Redis时所需的密码,一般测试情况下可以不用设定密码。不过,即使是作为本地访问,也建议设定一个密码。此处以简单的12345来演示
确定服务启动
下载安装redis桌面管理工具 redis-desktop-manager
启动后新建连接
基本操作
若启动命令行测试
1.Redis基本操作
redis是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset–有序集合)和hash(哈希类型)五种数据类型,存储形式均为字符串。
①String类型
存储:set key value
取值:get key
删除:del key
查看所有键:keys
127.0.0.1:6379> set key1 "nihao"
OK
127.0.0.1:6379> set key2 "haha"
OK
127.0.0.1:6379> keys *
1) "key1"
2) "key2"
增1:incr key
减1:decr key
注意, 虽然redis存储形式都是字符串,但是自增减的时候要求value必须能解析成数值类型,比如你的value是”1ad”那就不行。
示例:先添加键值对 str1 3,再自增就成了4
127.0.0.1:6379> set key3 "3"
OK
127.0.0.1:6379> get key3
"3"
127.0.0.1:6379> incr key3
(integer) 4
127.0.0.1:6379> get key3
"4"
②Hash类型
相当于一个key对于一个map,map中还有key-value
存储:hset key field value
取值:hget key field
127.0.0.1:6379> hset zhangsan age 33
(integer) 1
127.0.0.1:6379> hset zhangsan weight 66
(integer) 1
127.0.0.1:6379> hget zhangsan age
"33"
127.0.0.1:6379> hget zhangsan weight
"66"
查看某个键对应的map里面的所有key:hkeys key
查看某个键对应的map里面的所有的value:hvals key
查看某个键的map:hgetall key
java5:0>hkeys zhangsan
1) "age"
2) "weight"
java5:0>hvals zhangsan
1) "33"
2) "66"
java5:0>hgetall zhangsan
1) "age"
2) "33"
3) "weight"
4) "66"
③List类型
存储:push,分为lpush list v1 v2 v3 v4 …(左边添加),rpush list v1 v2 v3 v4 …(右边添加)
java5:0>lpush list1 1 2 3 4
"4"
取值:pop,分为lpop lpop list(左边取,移除list最左边的值) ,rpop rpop list(右边取,移除list最右边的值)
java5:0>lpop list1
"4"
查看list:lrange key 0 2
lrange key 0 -1表示查看全部
java5:0>lrange list2 0 2
1) "wangwu"
2) "lisi"
3) "zhangsan"
存储,取值操作跟栈的存储,取值方法是一样的,而不是add,get,存储的值有序可以重复。用pop取值取完后该值就从list中移除了。
④Set类型
Set中的元素是无序不重复的,出现重复会覆盖
存储:sadd key v1 v2 v3 …
java5:0>sadd set1 hello world 123
"3"
移除:srem key v
java5:0>srem set1 123
"1"
查看set集合: smembers key
java5:0>smembers set1
1) "world"
2) "hello"
另外还提供了差集,交集,并集操作
差集:sdiff seta setb(seta中有setb中没有的元素
redis:0>sadd set1 hello world nihao haha
"4"
redis:0>sadd set2 hello2 world2 nihao haha
"4"
redis:0>sdiff set1 set2
1) "hello"
2) "world"
交集:sinter seta setb
redis:0>sinter set1 set2
1) "haha"
2) "nihao"
并集:sunion seta setb
redis:0>sunion set1 set2
1) "hello2"
2) "haha"
3) "world"
4) "hello"
5) "world2"
⑤SortedSet,有序Set
存储:存储的时候要求对set进行排序,需要对存储的每个value值进行打分,默认排序是分数由低到高。zadd key 分数1 v1 分数2 v2 分数3 v3…
redis:0>zadd zset1 1 a 3 b 2 c 6 d 5 e 4 fredis:0>
"6"
redis:0>zrange zset1 0 -1
1) "a"
2) "c"
3) "b"
4) "f"
5) "e"
6) "d"
取值:取指定的值 zrem key value(取出后,Set当中对应少一个)
redis:0>zrem zset1 b
"1"
redis:0>zrem zset1 a
"1"
redis:0>zrem zset1 c
"1"
取(遍历)所有的值(不包括分数):zrange key 0 -1,降序取值用zrevrange key 0 -1
redis:0>zrange zset1 0 -1
1) "f"
2) "e"
3) "d"
redis:0>zrevrange zset1 0 -1
1) "d"
2) "e"
3) "f"
取所有的值(带分数):zrange(zrevrange) key 0 -1 withscores
redis:0>zrange zset1 0 -1 withscores
1) "f"
2) "4"
3) "e"
4) "5"
5) "d"
6) "6"
⑥key命令
由于redis是内存存储数据,所以不能够存储过大的数据量,所以存储在redis中的数据,在不再需要的时候应该清除掉。比如,用户买完东西下订单,生成的订单信息存储了在redis中,但是用户一直没支付那么存储在redis中的订单信息就应该清除掉,这个时候就可以通过设置redis的过期时间来完成,一旦达到了过期时间就清除该信息。
设置key的过期时间:expired key 过期时间(秒)
查看key的有效剩余时间:ttl key
redis:0>expire zone 60 // 以秒为单位
"0"
redis:0>ttl zone
"-2"
redis:0>expire zset1 30
"1"
redis:0>ttl zset1
"23"
redis:0>ttl zset1
"6"
redis:0>ttl zset1
"-2"
清除key的过期时间,持久化该key:persist key
-1:表示持久化
-2:表示该key不存在
redis:0>expire set1 200
"1"
redis:0>ttl set1
"194"
redis:0>ttl set1
"172"
redis:0>persist set1
"1"
redis:0>ttl set1
"-1"
对于上面的基本操作,一般而言,至少得要掌握String类型,Hash类型以及key命令。
项目中使用redis
pom.xml引入的依赖
<!-- redis-->
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>1.8.4.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
dp.properties需要配置的
redis.host=10.25.36.136
redis.port=6379
redis.password=123456
redis.maxIdle=300
redis.maxWaitMillis=1000
redis.maxTotal=600
redis.testOnBorrow=true
redis.testOnReturn=true
applicationContext-redis.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--设置连接池-->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}"/>
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
<property name="testOnReturn" value="${redis.testOnReturn}" />
</bean>
<!--设置链接属性-->
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName"><value>${redis.host}</value></property>
<property name="port"><value>${redis.port}</value></property>
<property name="password"><value>${redis.password}</value></property>
<property name="poolConfig"><ref bean="poolConfig"></ref></property>
<property name="timeout"><value>100000</value></property>
</bean>
<!-- Jedis模板配置 -->
<bean id="redisMapper" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
</bean>
</beans>
@Service
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
UserInfoMapper userInfoMapper;
@Autowired
private RedisTemplate redisTemplateMappper;
@Override
public PageDateUtils serchBy(PageUtils pageUtils) {
PageDateUtils pageDateUtils = new PageDateUtils();
pageDateUtils.setList(userInfoMapper.serchBy(pageUtils));
//到redis查看有没有代表总数的的数据,如果有直接赋值给total属性
Object object= redisTemplateMappper.opsForValue().get("totalCount");
if (object!=null){
System.out.println("redis你好");
String str= (String) object;
pageDateUtils.setTotal(Integer.valueOf(str));
}else{
//否则查询mysql,然后再给redis存入
System.out.println("mysql你好");
int total = userInfoMapper.findTotal(pageUtils);
redisTemplateMappper.opsForValue().set("totalCount",String.valueOf(total));
pageDateUtils.setTotal(total);
}
return pageDateUtils;
}
}