为什么80%的码农都做不了架构师?>>>
简介
Redis 是一款 开源 & 高性能 的key-value数据库,可用于构建高性能,可扩展的Web应用程序。
主要特点
Redis的三个主要特点:
- Redis数据库完全在内存中,使用磁盘仅用于持久性。
- Redis支持较为丰富的数据类型:支持字符串(String)、列表(List),集合(Set),有序集合(Sorted Sets),散列数据类型(Hashes)
- Redis可以将数据复制到任意数量的从服务器。
它提供了Java,C/C++,C#,PHP,Javascript,Perl,Object-C,Python,Ruby,Erlang等客户端,可以很方便地使用。
适用场景
Redis使用最佳方式是全部数据in-memory。
具体,可参考下面链接进行了解:
- 为什么使用 Redis及其产品定位
- Redis作者谈Redis应用场景
相关网址
安装
Mac OSX
如果Mac上有安装 Homebrew, 可以直接下载安装:
sudo brew install redis
如果没有安装 Homebrew,则可以通过下面Linux安装步骤进行安装。
Linux
下载安装包(下载链接),解压,编译.
1 2 3 4 | $ wget http://download.redis.io/releases/redis-3.0.5.tar.gz $ tar xzf redis-3.0.5.tar.gz $ cd redis-3.0.5 $ make |
步骤2:拷贝可执行文件至自定义目录
编译完成后,在 redis-3.0.5/src 目录,有生成对应的可执行文件:redis-server、 redis-cli, 可以将其拷贝到自定义目录下。
1 2 3 4 5 6 | $ cp src/redis-server /home/xxxx/redis/ $ cp src/redis-cli /home/xxxx/redis/ $ cp redis.conf /home/xxxx/redis/ $ cd /home/xxxx/redis/$ ./redis-server redis.conf #启动redis服务 |
如果想将Redis做成系统服务,可以参考这篇文章: Linux下redis的安装
Windows(32位、64位)
Redis Windows 版本由微软在维护,点击查看Github页面
不过,微软的Github上下载的仅支持64位操作系统的。下面的链接是
下载完成后,运行 redis-server.exe
, redis-cli.exe
即可启动Redis服务以及客户端程序。
redis.config 配置
vi redis.config
, 编辑下面的选项:
安全访问设置
1 2 | bind #设置访问IP的白名单,只接受白名单发送过来的请求 requirepass #设置访问密码 |
数据库文件设置
1 2 | dbfilename #设置数据库文件名称 dir #设置数据库文件存放的位置 |
主从数据库备份设置
1 2 3 | slaveof #设置主数据库的IP地址、端口 masterauth #主数据库访问的密码 slave-read-only no #默认 ,slave 数据库是只读的,如果需要开启读写,可以更改选项为 yes |
常用命令行
启动Redis服务
1 | $ redis-server <配置文件路径> #例如&#xff0c; &#96;redis-server redis.config&#96; |
client连接到Server
1 | $ redis-cli -a #例如&#xff0c;&#96;redis-cli -a admin&#96; |
关闭Server
1 2 | $ redis-cli -a #例如&#xff0c;&#96;redis-cli -a admin&#96; 127.0.0.1:6379> SHUTDOWN |
客户端使用(Java版本)
Redis拥有几乎所有主流编程语言的客户端&#xff0c;这里以 Java 客户端——Jedis为例。
下载Jedis
- jedis-2.1.0.jar
- commons-pool-1.5.4.jar: 如果需要使用 Jedis连接池&#xff0c;则需要下载该 Jar 包~
下载完&#xff0c;导入项目工程中&#xff0c;即可~
使用用例
Redis连接池代码
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 | /** * Redis 连接池 */ package com.test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig;public final class RedisUtil {//Redis服务器IPprivate static String ADDR &#61; "127.0.0.1"; //设置//Redis的端口号private static int PORT &#61; 6379;//访问密码private static String AUTH &#61; "admin"; //Redis服务器访问密码//可用连接实例的最大数目&#xff0c;默认值为8&#xff1b;//如果赋值为-1&#xff0c;则表示不限制&#xff1b;如果pool已经分配了maxActive个jedis实例&#xff0c;则此时pool的状态为exhausted(耗尽)。private static int MAX_ACTIVE &#61; 1024;//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例&#xff0c;默认值也是8。private static int MAX_IDLE &#61; 200;//等待可用连接的最大时间&#xff0c;单位毫秒&#xff0c;默认值为-1&#xff0c;表示永不超时。如果超过等待时间&#xff0c;则直接抛出JedisConnectionException&#xff1b;private static int MAX_WAIT &#61; 10000;private static int TIMEOUT &#61; 10000;//在borrow一个jedis实例时&#xff0c;是否提前进行validate操作&#xff1b;如果为true&#xff0c;则得到的jedis实例均是可用的&#xff1b;private static boolean TEST_ON_BORROW &#61; true;private static JedisPool jedisPool &#61; null;/*** 初始化Redis连接池*/static {try {JedisPoolConfig config &#61; new JedisPoolConfig();config.setMaxActive(MAX_ACTIVE);config.setMaxIdle(MAX_IDLE);config.setMaxWait(MAX_WAIT);config.setTestOnBorrow(TEST_ON_BORROW);jedisPool &#61; new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);} catch (Exception e) {e.printStackTrace();}}/*** 获取Jedis实例* &#64;return*/public synchronized static Jedis getJedis() {try {if (jedisPool !&#61; null) {Jedis resource &#61; jedisPool.getResource();return resource;} else {return null;}} catch (Exception e) {e.printStackTrace();return null;}}/*** 释放jedis资源* &#64;param jedis*/public static void returnResource(final Jedis jedis) {if (jedis !&#61; null) {jedisPool.returnResource(jedis);}} } |
下面是程序程序
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 | /* * 测试程序 */ package com.test;import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map;import org.junit.Before; import org.junit.Test;import redis.clients.jedis.Jedis;public class TestRedis {private Jedis jedis; &#64;Beforepublic void setup() {//连接redis服务器&#xff0c;192.168.0.100:6379jedis &#61; new Jedis("127.0.0.1", 6379);//权限认证jedis.auth("admin"); }/*** redis存储字符串*/&#64;Testpublic void testString() {//-----添加数据---------- jedis.set("name","xinxin");//向key-->name中放入了value-->xinxin System.out.println(jedis.get("name"));//执行结果&#xff1a;xinxin jedis.append("name", " is my lover"); //拼接System.out.println(jedis.get("name")); jedis.del("name"); //删除某个键System.out.println(jedis.get("name"));//设置多个键值对jedis.mset("name","liuling","age","23","qq","476777XXX");jedis.incr("age"); //进行加1操作System.out.println(jedis.get("name") &#43; "-" &#43; jedis.get("age") &#43; "-" &#43; jedis.get("qq"));}/*** redis操作Map*/&#64;Testpublic void testMap() {//-----添加数据---------- Map map &#61; new HashMap();map.put("name", "xinxin");map.put("age", "22");map.put("qq", "123456");jedis.hmset("user",map);//取出user中的name&#xff0c;执行结果:[minxr]-->注意结果是一个泛型的List //第一个参数是存入redis中map对象的key&#xff0c;后面跟的是放入map中的对象的key&#xff0c;后面的key可以跟多个&#xff0c;是可变参数 List rsmap &#61; jedis.hmget("user", "name", "age", "qq");System.out.println(rsmap); //删除map中的某个键值 jedis.hdel("user","age");System.out.println(jedis.hmget("user", "age")); //因为删除了&#xff0c;所以返回的是null System.out.println(jedis.hlen("user")); //返回key为user的键中存放的值的个数2 System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回true System.out.println(jedis.hkeys("user"));//返回map对象中的所有key System.out.println(jedis.hvals("user"));//返回map对象中的所有value Iterator iter&#61;jedis.hkeys("user").iterator(); while (iter.hasNext()){ String key &#61; iter.next(); System.out.println(key&#43;":"&#43;jedis.hmget("user",key)); } }/** * jedis操作List */ &#64;Test public void testList(){ //开始前&#xff0c;先移除所有的内容 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是按范围取出&#xff0c; // 第一个是key&#xff0c;第二个是起始位置&#xff0c;第三个是结束位置&#xff0c;jedis.llen获取长度 -1表示取得所有 System.out.println(jedis.lrange("java framework",0,-1)); jedis.del("java framework");jedis.rpush("java framework","spring"); jedis.rpush("java framework","struts"); jedis.rpush("java framework","hibernate"); System.out.println(jedis.lrange("java framework",0,-1));} /** * jedis操作Set */ &#64;Test public void testSet(){ //添加 jedis.sadd("user","liuling"); jedis.sadd("user","xinxin"); jedis.sadd("user","ling"); jedis.sadd("user","zhangxinxin");jedis.sadd("user","who"); //移除noname jedis.srem("user","who"); System.out.println(jedis.smembers("user"));//获取所有加入的value System.out.println(jedis.sismember("user", "who"));//判断 who 是否是user集合的元素 System.out.println(jedis.srandmember("user")); System.out.println(jedis.scard("user"));//返回集合的元素个数 } &#64;Test public void test() throws InterruptedException { //jedis 排序 //注意&#xff0c;此处的rpush和lpush是List的操作。是一个双向链表&#xff08;但从表现来看的&#xff09; jedis.del("a");//先清除数据&#xff0c;再加入数据进行测试 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)); } &#64;Testpublic void testRedisPool() {RedisUtil.getJedis().set("newname", "中文测试");System.out.println(RedisUtil.getJedis().get("newname"));} } |
相关链接
- 官方Github主页
- Java中使用Jedis操作Redis
- Jedis 2.1.0 API
Redis常用
主从复制&#xff08;Master-Slave&#xff09;
Redis 支持主从备份&#xff0c;可以通过设置 redis.conf 文件&#xff0c;即可实现&#xff0c;具体可以参考下面的文章&#xff1a;