Windows下Redis的安装使用

2019年12月01日 阅读数:128
这篇文章主要向大家介绍Windows下Redis的安装使用,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。
摘要   redis是一个key-value存储系统。和Memcached相似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的。在此基础上,redis支持各类不一样方式的排序。与memcached同样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了master-slave(主从...

 

目录[-]java

  • 0.前言
  • 1.安装Redis
  • 2.启动Redis
  • 3.测试使用
  • 4.Java开发包Jedis

0.前言

    由于是初次使用,因此是在windows下进行安装和使用,参考了几篇博客,下面整理一下git

1.安装Redis

官方网站:http://redis.io/github

官方下载:http://redis.io/download 能够根据须要下载不一样版本web

windows版:https://github.com/MSOpenTech/redisredis

github的资源能够ZIP直接下载的(这个是给不知道的同窗友情提示下)spring

下载完成后 能够右键解压到 某个硬盘下 好比D:\Redis\redis-2.6shell

在D:\Redis\redis-2.6\bin\release下 有两个zip包 一个32位一个64位 数据库

根据本身windows的位数 解压到D:\Redis\redis-2.6 根目录下windows

 

Redis安装文件解压后,有如下几个文件。见下图

redis-server.exe:服务程序
redis-check-dump.exe:本地数据库检查
redis-check-aof.exe:更新日志检查
redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (相似于 Apache 的ab 工具).缓存

2.启动Redis

进入redis目录后 开启服务  (注意加上redis.conf)

?
1
redis-server.exe redis.conf

这个窗口要保持开启  关闭时redis服务会自动关闭

redis会自动保存数据到硬盘 因此图中是我第二次开启时 多了一个 DB loaded from disk

 

设置一个Key并获取返回的值:

Java代码 收藏代码

  1. $ ./redis-cli set mykey somevalue 
  2. OK 
  3. $ ./redis-cli get mykey 
  4. Somevalue 

 

如何添加值到list: 

Java代码 收藏代码

  1. $ ./redis-cli lpush mylist firstvalue 
  2. OK 
  3. $ ./redis-cli lpush mylist secondvalue 
  4. OK 
  5. $ ./redis-cli lpush mylist thirdvalue 
  6. OK 
  7. $ ./redis-cli lrange mylist 0 -1
  8. . thirdvalue 
  9. . secondvalue 
  10. . firstvalue 
  11. $ ./redis-cli rpop mylist 
  12. firstvalue 
  13. $ ./redis-cli lrange mylist 0 -1
  14. . thirdvalue 
  15. . secondvalue 

 

redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (相似于 Apache 的 ab 工具).

Java代码 收藏代码

  1. ./redis-benchmark -n 100000 –c 50
  2.     ====== SET ====== 
  3. 100007 requests completed in 0.88 seconds (译者注:100004 查询完成于 1.14 秒 ) 
  4. 50 parallel clients (译者注:50个并发客户端) 
  5. 3 bytes payload (译者注:3字节有效载荷) 
  6. keep alive: 1 (译者注:保持1个链接) 
  7. 58.50% <= 0 milliseconds(译者注:毫秒) 
  8. 99.17% <= 1 milliseconds 
  9. 99.58% <= 2 milliseconds 
  10. 99.85% <= 3 milliseconds 
  11. 99.90% <= 6 milliseconds 
  12. 100.00% <= 9 milliseconds 
  13. 114293.71 requests per second(译者注:每秒 114293.71 次查询) 

Windows下测试并发客户端极限为60

3.测试使用

另外开启一个命令行窗口 进入redis目录下 (注意修改本身的ip)

?
1
redis-cli.exe -h 192.168.10.61 -p 6379

4.Java开发包Jedis

Jedis :http://www.oschina.net/p/jedis (Redis的官方首选Java开发包)

?
1
2
3
4
5
6
7
8
<!--Redis -->
        < dependency >
            < groupId >redis.clients</ groupId >
            < artifactId >jedis</ artifactId >
            < version >2.0.0</ version >
            < type >jar</ type >
            < scope >compile</ scope >
        </ dependency >

测试例子原帖:http://flychao88.iteye.com/blog/1527163

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
package com.lujianing.utils;
 
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
 
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
  * Created by lujianing on 14-2-28.
  */
public class JedisUtilTest {
 
 
 
        JedisPool pool;
        Jedis jedis;
        @Before
        public void setUp() {
            pool = new JedisPool( new JedisPoolConfig(), "192.168.10.61" );
 
            jedis = pool.getResource();
         //   jedis.auth("password");
        }
 
 
        @Test
        public void testGet(){
            System.out.println(jedis.get( "lu" ));
        }
 
        /**
         * Redis存储初级的字符串
         * CRUD
         */
        @Test
        public void testBasicString(){
            //-----添加数据----------
            jedis.set( "name" , "minxr" ); //向key-->name中放入了value-->minxr
            System.out.println(jedis.get( "name" )); //执行结果:minxr
 
            //-----修改数据-----------
            //一、在原来基础上修改
            jedis.append( "name" , "jarorwar" );   //很直观,相似map 将jarorwar append到已经有的value以后
            System.out.println(jedis.get( "name" )); //执行结果:minxrjarorwar
 
            //二、直接覆盖原来的数据
            jedis.set( "name" , "闵晓荣" );
            System.out.println(jedis.get( "name" )); //执行结果:闵晓荣
 
            //删除key对应的记录
            jedis.del( "name" );
            System.out.println(jedis.get( "name" )); //执行结果:null
 
            /**
             * mset至关于
             * jedis.set("name","minxr");
             * jedis.set("jarorwar","闵晓荣");
             */
            jedis.mset( "name" , "minxr" , "jarorwar" , "闵晓荣" );
            System.out.println(jedis.mget( "name" , "jarorwar" ));
 
        }
 
        /**
         * jedis操做Map
         */
        @Test
        public void testMap(){
            Map<String,String> user= new HashMap<String,String>();
            user.put( "name" , "minxr" );
            user.put( "pwd" , "password" );
            jedis.hmset( "user" ,user);
            //取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List
            //第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key能够跟多个,是可变参数
            List<String> rsmap = jedis.hmget( "user" , "name" );
            System.out.println(rsmap);
 
            //删除map中的某个键值
//        jedis.hdel("user","pwd");
            System.out.println(jedis.hmget( "user" , "pwd" )); //由于删除了,因此返回的是null
            System.out.println(jedis.hlen( "user" )); //返回key为user的键中存放的值的个数1
            System.out.println(jedis.exists( "user" )); //是否存在key为user的记录 返回true
            System.out.println(jedis.hkeys( "user" )); //返回map对象中的全部key  [pwd, name]
            System.out.println(jedis.hvals( "user" )); //返回map对象中的全部value  [minxr, password]
 
            Iterator<String> iter=jedis.hkeys( "user" ).iterator();
            while (iter.hasNext()){
                String key = iter.next();
                System.out.println(key+ ":" +jedis.hmget( "user" ,key));
            }
 
        }
 
        /**
         * jedis操做List
         */
        @Test
        public void testList(){
            //开始前,先移除全部的内容
            jedis.del( "java framework" );
            System.out.println(jedis.lrange( "java framework" , 0 ,- 1 ));
            //先向key java framework中存放三条数据
            jedis.lpush( "java framework" , "spring" );
            jedis.lpush( "java framework" , "struts" );
            jedis.lpush( "java framework" , "hibernate" );
            //再取出全部数据jedis.lrange是按范围取出,
            // 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得全部
            System.out.println(jedis.lrange( "java framework" , 0 ,- 1 ));
        }
 
        /**
         * jedis操做Set
         */
        @Test
        public void testSet(){
            //添加
            jedis.sadd( "sname" , "minxr" );
            jedis.sadd( "sname" , "jarorwar" );
            jedis.sadd( "sname" , "闵晓荣" );
            jedis.sadd( "sanme" , "noname" );
            //移除noname
            jedis.srem( "sname" , "noname" );
            System.out.println(jedis.smembers( "sname" )); //获取全部加入的value
            System.out.println(jedis.sismember( "sname" , "minxr" )); //判断 minxr 是不是sname集合的元素
            System.out.println(jedis.srandmember( "sname" ));
            System.out.println(jedis.scard( "sname" )); //返回集合的元素个数
        }
 
        @Test
        public void test() throws InterruptedException {
            //keys中传入的能够用通配符
            System.out.println(jedis.keys( "*" )); //返回当前库中全部的key  [sose, sanme, name, jarorwar, foo, sname, java framework, user, braand]
            System.out.println(jedis.keys( "*name" )); //返回的sname   [sname, name]
            System.out.println(jedis.del( "sanmdde" )); //删除key为sanmdde的对象  删除成功返回1 删除失败(或者不存在)返回 0
            System.out.println(jedis.ttl( "sname" )); //返回给定key的有效时间,若是是-1则表示永远有效
            jedis.setex( "timekey" , 10 , "min" ); //经过此方法,能够指定key的存活(有效时间) 时间为秒
            Thread.sleep( 5000 ); //睡眠5秒后,剩余时间将为<=5
            System.out.println(jedis.ttl( "timekey" ));   //输出结果为5
            jedis.setex( "timekey" , 1 , "min" );        //设为1后,下面再看剩余时间就是1了
            System.out.println(jedis.ttl( "timekey" ));  //输出结果为1
            System.out.println(jedis.exists( "key" )); //检查key是否存在
            System.out.println(jedis.rename( "timekey" , "time" ));
            System.out.println(jedis.get( "timekey" )); //由于移除,返回为null
            System.out.println(jedis.get( "time" )); //由于将timekey 重命名为time 因此能够取得值 min
 
            //jedis 排序
            //注意,此处的rpush和lpush是List的操做。是一个双向链表(但从表现来看的)
            jedis.del( "a" ); //先清除数据,再加入数据进行测试
            jedis.rpush( "a" , "1" );
            jedis.lpush( "a" , "6" );
            jedis.lpush( "a" , "3" );
            jedis.lpush( "a" , "9" );
            System.out.println(jedis.lrange( "a" , 0 ,- 1 )); // [9, 3, 6, 1]
            System.out.println(jedis.sort( "a" )); //[1, 3, 6, 9]  //输入排序后结果
            System.out.println(jedis.lrange( "a" , 0 ,- 1 ));
 
        }
 
 
}

Redis会定时 保存数据到硬盘上

上一篇: 19Redis
下一篇: Jedis使用