目录
Redis 是完全开源免费的,遵守BSD协议,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
特点: 支持数据的持久化,可以将内存中的数据保存到硬盘,在重启后再次加载使用。 支持的数据结构丰富,String,list,set, zset, hash等等。 支持数据备份,master-slave模式进行数据备份。
优势: 性能高,Redis能读的速度是110000次/s,写的速度是81000次/s。 数据类型丰富 原子性,redis中所有操作都是原子的,并且多个操作也支持原子性 丰富的特性,如通知,key过期等。
String是最常用的数据格式,普通的kay-value都归结为此类, value值不仅可以是string,可以是数字。 使用场景:通过用户的访问次数为依据封锁ip,可以将用户的访问次数已string类型记录在redis中,并通过 INCRBY操作,每次访问进行递增。 常用命令: get, set, incr, decr, mget
示例:
- # set
- set name zhangsan
-
- # get
- get name
-
- #查看redis所有key
- keys *
-
- #查看redis中以name开发的key
- keys name*
-
- #设置一个数字
- set num 1
-
- #自增
- incr num
-
- #递减
- decr num
使用场景: 例如用户包含id,name,addr等属性,当需要使用redis存放用户信息时,可以使用hash。(和java中的Map很像) 常用命令: hget,hset,hgetall等
示例:
- # 以user:001为键,hash中有两个属性name为zs,age为19
- hset user:001 name zs age 19
-
- #获取以user:001为键,属性age的值
- hget user:001 age
-
- # 获取键为user:001的所用属性值
- hgetall user:001
应用场景:最新消息排行; 消息队列。利用Lists的push的操作,将任务存储在list中,然后工作线程再用pop操作将任务取出进行执行。
常用命令: lpush,rpush,lpop,rpop,lrange,BLPOP(阻塞版)等
示例:
- # 向队列中push数据
- lpush bills zs li wu zl
-
- #从队列中弹出数据,弹出后队列中的数据不保存
- lpop bills
-
- #队列的长度
- llen bills
常用场景: set与list比较类似,特殊之处是set可以自动排重,同时set还提供了某个成员是否存在于一个set内的接口,这个在list也没有。 常用命令: sadd,srem,spop,sdiff ,smembers,sunion 等 
- 示例:
-
- # 向集合aa中加入1 2 3 4 5
- sadd aa 1 2 3 4 5
-
- # 向集合bb中加入4 5 6 7 8
- sadd bb 4 5 6 7 8
-
- # 返回集合aa中的所有元素
- smembers aa
-
- # 判断集合aa中是否存在元素1 ,存在返回1,不存在返回0
- sismember aa 1
-
- #返回aa集合中存在但bb中不存在的元素,返回 1 2 3 (差集)
- sdiff aa bb
-
- #求aa和bb集合的差集,并将结果保存到cc中去
- sdiffstore cc aa bb
-
- #求aa和bb的交集
- sinter aa bb
-
- #求aa和bb的交集,并将其存放到dd集合中去
- sinterstore dd aa bb
-
- #求aa和bb的并集
- sunion aa bb
-
- #求aa和bb的并集,将将其结果存放如ee集合
- sunionstore ee aa bb
-
- # 从ee集合中弹出3个元素(随机),默认弹出1个元素
- spop ee 3
使用场景:zset的使用场景与set类似,区别是set不是有序的,而zset可以通过用户额外提供的一个优先级(score即分值)参数来为成员排序,插入后自动排序。例如:将所有评论按发表时间为score存储,可以方便获取最新发表的评论;全班同学成绩的SortedSets,value可以是同学的学号,而score就可以是其考试得分,这样数据插入集合的,就已经进行了天然的排序。 另外还可以用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。
常用命令: zadd,zrange,zrem,zcard,zcount等
示例:
- #将zs, ww, ls加入有序集合,其中zs 分值为1, ww 分值为2, ls分值为3
- zadd zaa 1 zs 2 ww 3 ls
-
- #获取zaa集合中score值从1到2范围内的元素
- zrangebyscore zaa 1 2
-
- #获取有序集合的成员数
- zcard zaa
-
- #计算在有序集合中指定区间分数的成员数
- zcount zaa 1 2
- #判断key在redis中是否存在。
- exists key
1)创建一个maven工程 File ->New -> maven project -> create a simple project,输入maven坐标。
2) 在pom.xml文件中加jedis依赖
- <dependencies>
- <dependency>
- <groupId>redis.clients</groupId>
- <artifactId>jedis</artifactId>
- <version>2.9.0</version>
- </dependency>
- </dependencies>
3)在pom.xml中指定jdk版本
- <build>
- <finalName>填写自己的项目名称</finalName>
- <plugins>
- <!--第一步就是配置maven-compiler-plugin插件 -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.7.0</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- <encoding>UTF-8</encoding>
- </configuration>
- </plugin>
- </plugins>
- </build>
3)示例代码
- //创建Jedis实例,连接redis
- Jedis jedis = new Jedis("192.168.62.133",6379);
-
- //ping,如果成功返回 pong
- String rv = jedis.ping();
- System.out.println(rv);
-
- //string
- jedis.set("name", "zs");
-
- //hash
- jedis.hset("user", "name", "张三");
- jedis.hset("user", "age", "20");
- jedis.hset("user", "tele", "12344344343");
- jedis.hset("user", "addr", "长沙");
-
- Map<String,String> user = new HashMap<>();
- user.put("name", "李四");
- user.put("age", "23");
- user.put("tele", "23897989");
- user.put("addr", "成都");
- jedis.hmset("user02", user);
-
- //list
- jedis.lpush("list", "a");
- jedis.lpush("list", "b");
- jedis.lpush("list", "c");
- jedis.lpush("list", "d");
-
- System.out.println(jedis.rpop("list"));
- System.out.println(jedis.rpop("list"));
- System.out.println(jedis.rpop("list"));
- System.out.println(jedis.rpop("list"));
-
- //set
- jedis.sadd("set", "aa","bb","cc");
- System.out.println(jedis.spop("set"));
- System.out.println(jedis.spop("set"));
- System.out.println(jedis.spop("set"));
-
- //sortset
- Map<String,Double> zz = new HashMap<>();
- zz.put("zz", 0.1D);
- jedis.zadd("zset", zz);
-
- Map<String,Double> ff = new HashMap<>();
- ff.put("ff", 0.2D);
- jedis.zadd("zset", ff);
-
- Map<String,Double> qq = new HashMap<>();
- qq.put("qq", 0.3D);
- jedis.zadd("zset", qq);
-
- System.out.println(jedis.zrangeByScore("zset", 0.1, 0.2));
-
- //命令返回有序集中,指定区间内的成员, 其中成员的位置按分数值递减(从大到小)来排列
- System.out.println(jedis.zrevrange("zset", 0, -1));
1) 在pom.xml文件中导入依赖的包
- <properties>
-
- <redis.version>2.9.0redis.version>
- <spring.redis.version>2.0.10.RELEASEspring.redis.version>
- <spring.version>5.0.1.RELEASEspring.version>
- properties>
-
- <dependencies>
- <dependency>
- <groupId>redis.clientsgroupId>
- <artifactId>jedisartifactId>
- <version>${redis.version}version>
- dependency>
-
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-contextartifactId>
- <version>${spring.version}version>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-ormartifactId>
- <version>${spring.version}version>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webartifactId>
- <version>${spring.version}version>
- dependency>
-
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-aopartifactId>
- <version>${spring.version}version>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-testartifactId>
- <version>${spring.version}version>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-aspectsartifactId>
- <version>${spring.version}version>
- dependency>
-
- <dependency>
- <groupId>org.aspectjgroupId>
- <artifactId>aspectjrtartifactId>
- <version>1.6.11version>
- dependency>
-
- <dependency>
- <groupId>org.aspectjgroupId>
- <artifactId>aspectjweaverartifactId>
- <version>1.6.11version>
- dependency>
-
- <dependency>
- <groupId>cglibgroupId>
- <artifactId>cglibartifactId>
- <version>2.1_3version>
- dependency>
-
-
- <dependency>
- <groupId>org.springframework.datagroupId>
- <artifactId>spring-data-redisartifactId>
- <version>1.7.2.RELEASEversion>
- dependency>
-
-
-
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-coreartifactId>
- <version>2.1.0version>
- dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-databindartifactId>
- <version>2.1.0version>
- dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-annotationsartifactId>
- <version>2.1.0version>
- dependency>
-
-
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.12version>
- <scope>testscope>
- dependency>
-
- dependencies>
2)spring-redis.xml
- "1.0" encoding="UTF-8"?>
-
- <beans xmlns="http://www.springframework.org/schema/beans"
-
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:aop="http://www.springframework.org/schema/aop"
-
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:tx="http://www.springframework.org/schema/tx"
-
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-4.3.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
-
- <context:component-scan base-package="com.zking"/>
-
-
- <context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true" />
-
-
-
- <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
- <property name="maxTotal" value="${redis.maxActive}" />
- <property name="maxIdle" value="${redis.maxIdle}" />
- <property name="testOnBorrow" value="${redis.testOnBorrow}" />
- bean>
-
-
- <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
- <property name="hostName" value="${redis.host}">property>
- <property name="port" value="${redis.port}">property>
-
- <property name="poolConfig" ref="poolConfig">property>
- bean>
-
-
-
- <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
- <property name="connectionFactory" ref="jedisConnectionFactory"/>
-
-
- <property name="keySerializer" >
- <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
- property>
- <property name="valueSerializer" >
- <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
- property>
- <property name="hashKeySerializer">
- <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
- property>
- <property name="hashValueSerializer">
- <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
- property>
-
- <property name="enableTransactionSupport" value="true">
- property>
-
-
- beans>
3) 测试类
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration("classpath*:spring*.xml")
- @SuppressWarnings("all")
- public class TestRedis {
-
- @Autowired
- private RedisTemplate
redisTemplate; -
- @Test
- public void testRedis() {
- redisTemplate.opsForHash().put("myhash", "name", "xiaoxiao");
- redisTemplate.opsForHash().put("myhash", "age", "12");
- redisTemplate.opsForHash().put("myhash", "addr", "changsha");
-
- Map
-
- for(Map.Entry e: entries.entrySet()) {
- System.out.println(e.getKey());
- System.out.println(e.getValue());
- }
- }
- }
测试类通过则说明集成完成(请确定redis可正常访问)