热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Redis安装、配置及使用

为什么80%的码农都做不了架构师?简介Redis是一款开源&高性能的key-value数据库,可用于构建高性能,可扩展的Web应用程

为什么80%的码农都做不了架构师?>>>   hot3.png

简介

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应用场景

相关网址

  • 官方网站-英文
  • 官方网站-中文
  • 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位操作系统的。下面的链接是

  • 支持32位&64位版本
  • 64位稳定版本

下载完成后,运行 redis-server.exeredis-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;

  • Redis学习手册

转:https://my.oschina.net/crong/blog/743449



推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • 在List和Set集合中存储Object类型的数据元素 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Swoole加密机制的安全性分析与破解可能性探讨
    本文深入分析了Swoole框架的加密机制,探讨了其在实际应用中的安全性,并评估了潜在的破解可能性。研究结果表明,尽管Swoole的加密算法在大多数情况下能够提供有效的安全保护,但在特定场景下仍存在被攻击的风险。文章还提出了一些改进措施,以增强系统的整体安全性。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • Java学习第10天:深入理解Map接口及其应用 ... [详细]
  • 在使用USB接口的二维条码扫描器时,发现其无法正确识别条码中的中文字符。然而,采用串口连接的方式则能够成功识别。目前面临的问题是如何将通过串口获取的数据在网页中进行实时展示,希望各位专家能提供解决方案,不胜感激。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 在PHP多线程扩展开发中,面临的主要挑战之一是多线程调用PHP用户类方法时可能出现的内存错误。具体表现为当多个线程同时调用同一个类实例的同一方法时,系统会抛出内存错误。为了解决这一问题,本文深入分析了PHP多线程扩展的实现机制,并提出了几种有效的解决方案和技术思路,包括线程安全的类设计、内存管理优化以及线程同步机制的改进。通过这些方法,可以显著提升PHP多线程扩展的稳定性和性能。 ... [详细]
author-avatar
明佳妈妈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有