Posted in Working Skills, 技术

数据库必会必知 之 SQL四种语言:DDL DML DCL TCL

作者:泥瓦匠
今天群里面讨论,DDL 还是 DML,我这种小白还是总结下他们的区别吧。

1. DDL – Data Definition Language

数据库定义语言:定义数据库的结构。

其主要命令有CREATE,ALTER,DROP等,下面用例子详解。该语言不需要commit,因此慎重。

CREATE – to create objects in the database   在数据库创建对象

例:CREATE DATABASE test; // 创建一个名为test的数据库

ALTER – alters the structure of the database   修改数据库结构

例:ALTER TABLE test ADD birthday date; // 修改test表,新增date类型的birthday列

DROP – delete objects from the database   从数据库中删除对象

例:DROP DATABASE test;// 删除test数据库

还有其他的:

TRUNCATE – 截断表内容(开发期,还是挺常用的)

COMMENT – 为数据字典添加备注

 

2. DML – Data Manipulation Language

数据库操作语言:SQL中处理数据库中的数据

其主要命令有INSERT,UPDATE,DELETE等,这些例子大家常用就不一一介绍了。该语言需要commit。还有常用的 LOCK TABLE ,记得写过锁的博客 – 传送门

还有其他不熟悉的:

CALL – 调用一个PL/SQL或Java子程序
EXPLAIN PLAN – 解析分析数据访问路径

 

3. DCL – Data Control Language

数据库控制语言:授权,角色控制等

GRANT – 为用户赋予访问权限

REVOKE – 撤回授权权限

 

4. TCL – Transaction Control Language

事务控制语言

COMMIT – 保存已完成的工作

SAVEPOINT – 在事务中设置保存点,可以回滚到此处

ROLLBACK – 回滚

SET TRANSACTION – 改变事务选项

例子:Java中JDBC封装了对事务的支持。比如我们首先新建一个表:test

test.sql

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `city`
-- ----------------------------
DROP TABLE IF EXISTS `city`;
CREATE TABLE `city` (
  `id` int(11) NOT NULL DEFAULT '0' COMMENT '城市ID',
  `name` varchar(20) DEFAULT NULL COMMENT '名称',
  `state` varchar(20) DEFAULT NULL COMMENT '状态',
  `country` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

SET FOREIGN_KEY_CHECKS = 1;

JDBC事务回滚第一个例子 -JDBC数据库事务回滚:

/**
 * 描述:JDBC数据库事务回滚
 *
 * Created by bysocket on 16/6/6.
 */
public class TransactionRollBack extends BaseJDBC {

    public static void main(String[] args) throws SQLException {
        Connection conn = null;
        try {
            // 加载数据库驱动
            Class.forName(DRIVER);
            // 数据库连接
            conn = DriverManager.getConnection(URL,USER,PWD);

            // 关闭自动提交的事务机制
            conn.setAutoCommit(false);
            // 设置事务隔离级别 SERIALIZABLE
            conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

            Statement stmt = conn.createStatement();
            int rows = stmt.executeUpdate("INSERT INTO city VALUES (3,'china',1,'cc')");
            rows = stmt.executeUpdate("UPDATE city set country = 'TAIWAN' WHERE id = 4");

            // 提交事务
            conn.commit();
        } catch (Exception e) {
            e.printStackTrace();
            // 回滚事务
            if (conn != null) {
                conn.rollback();
            }
        } finally {
            /** 关闭数据库连接 */
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

第 19 行:设置了事务隔离级别为 SERIALIZABLE 底层调用的是TCL语言的SET TRANSACTION

第 22 行:执行通过,插入数据

第 23 行:执行不通过,没有主键为4的记录,直接抛出异常

第 31 行:事务回滚,封装的就是 TCL 语句的ROLLBACK

休息下,一个例子不够,再来一个。代码都在github主页上。https://github.com/JeffLi1993/jee-component-learning

JDBC事务回滚第二个例子-JDBC数据库事务回滚,回滚到特定的保存点:

/**
 * 描述:JDBC数据库事务回滚,回滚到特定的保存点
 *
 * Created by bysocket on 16/6/6.
 */
public class TransactionRollBack2 extends BaseJDBC {
    public static void main(String[] args) throws SQLException {
        Connection conn = null;
        Savepoint svpt = null;
        try {
            // 加载数据库驱动
            Class.forName(DRIVER);
            // 数据库连接
            conn = DriverManager.getConnection(URL,USER,PWD);

            // 关闭自动提交的事务机制
            conn.setAutoCommit(false);
            // 设置事务隔离级别 SERIALIZABLE
            conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

            Statement stmt = conn.createStatement();
            int rows = stmt.executeUpdate("INSERT INTO city VALUES (3,'china',1,'cc')");
            // 设置事务保存点
            svpt = conn.setSavepoint();
            rows = stmt.executeUpdate("UPDATE city set country = 'TAIWAN' WHERE id = 4");

            // 提交事务
            conn.commit();
        } catch (Exception e) {
            e.printStackTrace();
            // 回滚事务
            if (conn != null) {
                conn.rollback(svpt);
            }
        } finally {
            /** 关闭数据库连接 */
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

和第一个例子重复的就不提了。

第 9 行:声明了一个保存点

第 24 行:设置了保存点

第 33 行:回滚事务到该保存点

上面的代码涉及到的是 TCL语言中的 SAVEPOINT

 

最后来张图总结:(SELECT属于DQL哈。)

QQ20160612-0


如以上文章或链接对你有帮助的话,别忘了分享到朋友圈,让更多的人阅读这篇文章。

 

Posted in 清文

《大冰的小屋》 – 厦门

那是喧嚣的厦门曾厝垵,巷子最里面的《大冰的小屋》。上图:
1.pic
胖胖的那位简称胖子,内蒙人,流浪歌手。貌似在过天桥的时候已经注意到他在唱,转了下,他移到了大冰的小屋继续唱。原来是一个女生,胆大的歌手。唱完了听胖子唱回味无穷,和两个哥们,喝着风花雪月,听了若干小时。听出了

段子

胖子30多了,冷不丁和旁边孩子都6岁的大女生调侃。然后各种能逗乐,耐逗乐的段子。这是我脑子里有了一首歌赵雷《三十岁的女人》:

“三十岁了

光芒和激情已被岁月打磨

是不是一个人的生活

比两个人更快活”
眼前的胖子,他年龄却不是真正30了,我却觉得他依旧没有被生活迫着走,就像我看到那些和他调侃的大女人也有心里丝丝向外走的心。

行走

唱完一首,说了下故事。唱完了各个中国大陆,脚踏实地。唱来的钱献给了希望小学,献给了他感觉快乐的事。是快乐的事。我们多少被生活牵着走,财务自由才能做自己喜欢的事。有时候确实自己的欲望越来越大了罢了。所以今年我打算多走走,有空就去 哦也~

开心

胖子又开心的各种乐器show,各种搞怪show。开心唱一天,说喉咙哑了,还继续。为嘛为嘛,开心嘛。

体验

毕业去厦门,这胖子深有印象。听哥们看过大冰《阿弥陀佛 么么哒》的书说,不错。我赶紧入手了。体验着当下,体验这生活给我带来的what ever。体验珍惜每一天。比如爱,比如什么的。我的目标:不工作。但我如果工作,我会认真对待体验工作。
  
Posted in 技术

记博客挂了的事

wordpress 突然 告诉我:

建立数据库连接时出错

聪明的我,肯定知道。ssh 博客地址 — service mysql restart。没有重启解决不了的问题的。

可是,还是不行。。 最后定位谨记之

问题:wp_options 表挂了

修复之:repair table wp_options

Posted in Java, 技术

图解 & 深入浅出JavaWeb:事务必会必知

事务,大家所熟悉的事务(Transaction),基本上会就往Spring事务靠。其实Spring事务管理基于底层数据库本身的事务处理机制。数据库事务的基础,是掌握Spring事务管理的基础。这篇总结下数据库事务。

一、数据库事务

它的思想:we are 伐木累。就是多个SQL语句(一个团队),要么所有执行success,不然就fail。

它最终的目标:数据不会被破坏。即事务操作成功,数据的结果和业务期待的结果是一致的。这也就是ACID中的一致性(Consistency)。那什么是ACID呢?

 

二、ACID

上面是思想,牛人马上根据思想建模,DBMS中数据库事务满足4各特性,即原子性、一致性、隔离性和持久性。下面一一生动解释:

a)原子性

原子是物质的最小单元,即不可再分。

例如,以MySQL为例,每一个简单的 SQL 语句即包含在一个事务中,具有原子性。这时候有人问了,那多个SQL呢?

BEGIN TRANSACTION;

INSERT INTO `test`.`city` (`state`, `country`, `name`)

VALUES

('1', 'China', 'CHINA','错误语句多了个VALUE');

INSERT INTO `test`.`city` (`state`, `country`, `name`)

VALUES

('1', 'China', 'CHINA');

COMMIT;

 

结果:执行不通过。行3-5:为一个错误SQL。行6-8:是一个正确的SQL。它们各自被包裹在各自的隐式事务中,即Read Uncommited。T-all包裹了上面具有原子性的T-1和T-2,实现了更大的原子,如下图。

2

b)一致性

终极目标:数据不会被破坏。(这不是废话?确实有点)具体说,事务操作成功后,数据库所处的状态和它的业务规则是一致的,即数据不会被破坏。举个栗子:两句UPDATE语句,从A账户转账到B账户,不管成功失败,A和B账户的总额是不变的。

c)隔离性

隔离:表示互不干扰。事务与事务之间无法干扰,即每个事务独立,不会交叉。这样可以让多个线程并发访问数据库。如图:

3

但是聪明的小伙伴知道,如果事务完全隔离,每次只允许一个事务能访问数据库,那其他都是阻塞。会非常慢。

但是聪明的小伙伴也知道,这样会造成数据的并发问题。(是的,在下面第三节讲)。

d)持久性

数据必须持久化到数据库(存储在磁盘)中。已提交的事务,即使在提交后数据库崩溃,重启数据库时也能够根据日志对未持久化的数据进行重执行操作。(同学会问,那没提交的事务呢?那就悲剧了(>﹏<))

小结:数据的一致性是最终目标,其他特性都是其要求或手段。

 

三、隔离性中的问题:脏读、不可重复读和幻读

对应上面的隔离性,事务并发访问的时候会出现:脏读、不可重复读和幻读。案例转自勇哥博客

脏读:A事务读取了B事务未提交的更改数据。一般数据库事务默认不允许该问题出现。

比如这里查询应该是1500,现在出现了脏读。

时间 事务 A(存款) 事务 B(取款)
T1 开始事务
T2 开始事务
T3 查询余额(1000 元)
T4 取出 1000 元(余额 0 元)
T5 查询余额(0 元)
T6 撤销事务(余额恢复为 1000 元)
T7 存入 500 元(余额 500 元)
T8 提交事务

不可重复读:A事务读取了B事务已提交的更改数据。

幻读:A事务读取了B事务提交的新增数据。

上面的案例脑补吧,主要还是看下面。

 

不可重复读和幻读区别:一个更改,一个新增数据。其实两个区别在于一个是新增(insert语句),处理幻读这个操作需要加表级别的锁,将整个表锁定,防止新增数据造成幻读。另一个则是更改(update delete),这时候避免这个情况只需要添加行级锁组织该行发生变化即可。

 

四、事务隔离级别

既要求高的隔离性(安全性),又要求高并发性。这种是不可能的任务。根据各种锁的操作机制出现了一个事务隔离级别。即相同情况下的输入,不同隔离级别结果不同。为啥了,当然是在并发性和安全性的抉择。如图:

6

按着图说的,根据程序的并发性和安全性的抉择。鱼和熊掌不可兼得也~ 但分布式的时候,可以吧安全性关键的单独分布式锁。

好了,案例说了很多下面代码实战。

 

ps: 休息下,泥瓦匠的代码都会这github上~ ,这段代码地址:https://github.com/JeffLi1993/jee-component-learning

 

五 、JDBC事务实战

下面利用MYSQL JDBC驱动连接MySQL,代码如下:

public class TransactionLevels extends BaseJDBC {
    public static void main(String[] args) {
        try {
            // 加载数据库驱动
            Class.forName(DRIVER);
            // 数据库连接
            Connection conn = DriverManager.getConnection(URL,USER,PWD);
            // 数据库元数据
            DatabaseMetaData metaData = conn.getMetaData();

            // 是否支持事务
            boolean isSupport = metaData.supportsTransactions();
            System.out.println(isSupport);
            // 是否支持的事务
            boolean isSupportLevel = metaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE);
            System.out.println(isSupportLevel);
            // 获取默认事务
            int defaultIsolation = metaData.getDefaultTransactionIsolation();
            System.out.println(defaultIsolation);

            /** 关闭数据库连接 */
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

第 5、7行是连接数据库

第 9 行:获取数据库元数据,这是包含数据库连接信息

第 12 行:从元数据中,判断是否支持事务

第 15 行:从元数据中,判断是否支持事务级别 TRANSACTION_SERIALIZABLE

第 18 行:这里可以看出MySQL默认支持的事务级别是 READ_COMMITTED,默认会隔离脏读。

具体源码如下:

4

因此在安全性要求不高,支持高并发的情况下,选择MySQL默认事务等级。但在安全性极高,几乎不会出现高并发情况下,选择更高的事务等级。根据上小节的图一幕了然。

 

六、补充

关于事务,还有大家熟悉的Spring事务管理、具体数据库事务的实现,推荐一本书《MySQL技术内幕InnoDB存储引擎 》。

下一篇:ThreadLocal的工作机制,揭示Spring事务同步管理器的工作原理

如以上文章或链接对你有帮助的话,别忘了分享到朋友圈,让更多的人阅读这篇文章。

Posted in 清文

2016 4月 随笔

2016-04-11

今晚 我看到了没有雾霾最亮的夜晚

2016-04-16

屋顶上看明月 空气真好

还能听到几声乌鸦叫。

2016-04-18

2016-04-25

以前是人放狗看家,现在是狗牵着人散步

2016-04-29

我们想法不同

但走的路一样

走着、自由着

分散在城市的各个角落

05-02 我的生日于劳动节,我的目标却是不工作不劳动。哈哈 祝大家节日快乐


476be76fgw1f2h8nmf53wj20yj194alj

Posted in Spring, Spring Boot, 技术

Spring Boot 之 HelloWorld详解

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

“以前是人放狗看家,现在是狗牵着人散步” — 随笔

Spring Boot 系列文章:《Spring Boot 那些事

一、Spring Boot 自述

世界上最好的文档来源自官方的《Spring Boot Reference Guide》,是这样介绍的:

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”…Most Spring Boot applications need very little Spring configuration.

Spring Boot(英文中是“引导”的意思),是用来简化Spring应用的搭建到开发的过程。应用开箱即用,只要通过 “just run”(可能是 java -jar 或 tomcat 或 maven插件run 或 shell脚本),就可以启动项目。二者,Spring Boot 只要很少的Spring配置文件(例如那些xml,property)。

因为“习惯优先于配置”的原则,使得Spring Boot在快速开发应用和微服务架构实践中得到广泛应用。

 

Javaer装好JDK环境和Maven工具就可以开始学习Boot了~

二、HelloWorld实战详解

首先得有个maven基础项目,可以直接使用Maven骨架工程生成Maven骨架Web项目,即man archetype:generate命令:

mvn archetype:generate -DgroupId=springboot -DartifactId=springboot-helloworld -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

2.1  pom.xml配置

代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>springboot</groupId>
    <artifactId>springboot-helloworld</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-helloworld :: HelloWorld Demo</name>

    <!-- Spring Boot 启动父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.3.RELEASE</version>
    </parent>

    <dependencies>
        <!-- Spring Boot web依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</project>

只要加入一个 Spring Boot 启动父依赖即可。

 

2.2 Controller层

HelloWorldController的代码如下:

/**
 * Spring Boot HelloWorld案例
 *
 * Created by bysocket on 16/4/26.
 */
@RestController
public class HelloWorldController {

    @RequestMapping("/")
    public String sayHello() {
        return "Hello,World!";
    }
}

@RestController和@RequestMapping注解是来自SpringMVC的注解,它们不是SpringBoot的特定部分。

1. @RestController:提供实现了REST API,可以服务JSON,XML或者其他。这里是以String的形式渲染出结果。

2. @RequestMapping:提供路由信息,”/“路径的HTTP Request都会被映射到sayHello方法进行处理。

具体参考,世界上最好的文档来源自官方的《Spring Framework Document

2.3 启动应用类

和第一段描述一样,开箱即用。如下面Application类:

/**
 * Spring Boot应用启动类
 *
 * Created by bysocket on 16/4/26.
 */
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

1. @SpringBootApplication:Spring Boot 应用的标识

2. Application很简单,一个main函数作为主入口。SpringApplication引导应用,并将Application本身作为参数传递给run方法。具体run方法会启动嵌入式的Tomcat并初始化Spring环境及其各Spring组件。

 

2.4 Controller层测试类

一个好的程序,不能缺少好的UT。针对HelloWorldController的UT如下:

/**
 * Spring Boot HelloWorldController 测试 - {@link HelloWorldController}
 *
 * Created by bysocket on 16/4/26.
 */
public class HelloWorldControllerTest {

    @Test
    public void testSayHello() {
        assertEquals("Hello,World!",new HelloWorldController().sayHello());
    }
}

 

三、运行

Just Run的宗旨,运行很简单,直接右键Run运行Application类。同样你也可以Debug Run。可以在控制台中看到:

Tomcat started on port(s): 8080 (http)
Started Application in 5.986 seconds (JVM running for 7.398)

然后访问 http://localhost:8080/ ,即可在页面中看到Spring Boot对你 say hello:

Hello,World!

 

四、小结

1. Spring Boot pom配置

2. Spring Boot 启动及原理

3. 对应代码分享在 Github 主页


如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。

Posted in Spring Boot, 技术

Spring Boot 之 RESRful API 权限控制

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

“简单,踏实~ 读书写字放屁”

一、为何用RESTful API

1.1 RESTful是什么?

RESTful(Representational State Transfer)架构风格,是一个Web自身的架构风格,底层主要基于HTTP协议(ps:提出者就是HTTP协议的作者),是分布式应用架构的伟大实践理论。RESTful架构是无状态的,表现为请求-响应的形式,有别于基于Bower的SessionId不同。

 

1.2理解REST有五点:

1.资源 

2.资源的表述 

3.状态的转移 

4.统一接口 

5.超文本驱动

需要理解详情,请点[传送门]

 

1.3 什么是REST API?

基于RESTful架构的一套互联网分布式的API设计理论。和上面资源,状态和统一接口有着密切的关系。

为啥分布式互联网架构很常见呢?请看下面两个模式

MVC模式:

 

REST API模式:


 

1.4 权限怎么控制?

RESTful针对资源的方法定义分简单和关联复杂两种。

基本方法定义:

GET /user # 获取user列表
GET /user/3 # 查看序号为3的user
POST /user # 新建一个user
PUT /user/3  # 更新序号为3的user
DELETE /user/3 #删除user 3

资源之间的关联方法如下定义:

GET /admin/1/user/10 # 管理员1号,查看序号为3的user信息
...

那么权限如何控制?

 

二、权限控制

前面说到,RESTful是无状态的,所以每次请求就需要对起进行认证和授权。

2.1 认证

身份认证,即登录验证用户是否拥有相应的身份。简单的说就是一个Web页面点击登录后,服务端进行用户密码的校验。

2.2 权限验证(授权)

也可以说成授权,就是在身份认证后,验证该身份具体拥有某种权限。即针对于某种资源的CRUD,不同用户的操作权限是不同的。

一般简单项目:做个sign(加密加盐参数)+ 针对用户的access_token

复杂的话,加入 SLL ,并使用OAuth2进行对token的安全传输。

自然,技术服务于应用场景。既简单又可以处理应用场景即可。简单,实用即可~

 

三、Access Token权限解决

3.1 AccessToken 拦截器

/**
 * Access Token拦截器
 * <p/>
 * Created by bysocket on 16/4/18.
 */
@Component
public class AccessTokenVerifyInterceptor extends HandlerInterceptorAdapter {

    @Autowired
    ValidationService validationService;

    private final static Logger LOG = LoggerFactory.getLogger(AccessTokenVerifyInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        LOG.info("AccessToken executing ...");
        boolean flag = false;
        // token
        String accessToken = request.getParameter("token");
        if (StringUtils.isNotBlank(accessToken)) {
            // 验证
            ValidationModel v = validationService.verifyAccessToken(accessToken);
            // 时间过期

            // 用户验证
            if (v != null) {
                User user = userService.findById(v.getUid());
                if(user != null) {
                    request.setAttribute(CommonConst.PARAM_USER, user);
                    LOG.info("AccessToken SUCCESS ...  user:" + user.getUserName() + " - " + accessToken);
                    flag = true;
                }
            }
        }

        if (!flag) {
            response.setStatus(HttpStatus.FORBIDDEN.value());
            response.getWriter().print("AccessToken ERROR");
        }

        return flag;
    }
}

 

第一步:从request获取token

第二步:根据token获取校验对象信息(也可以加入过期时间校验,简单)

第三步:通过校验信息获取用户信息

3.2 配置拦截

/**
 * MVC 设置
 *
 */
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Bean
    public AccessTokenVerifyInterceptor tokenVerifyInterceptor() {
        return new AccessTokenVerifyInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(tokenVerifyInterceptor()).addPathPatterns("/test");
        super.addInterceptors(registry);
    }

}

 

第一步:将拦截器配置成Bean

第二步:拦截器注册注入该拦截器,并配置拦截的URL

 

token存哪里?

ehcache,redis,db都可以。自然简单的当然是db。

 

四、小结

1. REST API

2. Spring Boot 拦截器

 

欢迎点击我的博客及GitHub — 博客提供RSS订阅哦!

———- http://www.bysocket.com/ ————-https://github.com/JeffLi1993 ———-

微         博:BYSocket  豆         瓣:BYSocket  FaceBook:BYSocket  Twitter    :BYSocket

Posted in 技术

Linux之Redis安装

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!


一、下载解压

## 下载Redis
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
## 解压
tar zxvf redis-2.8.17.tar.gz

二、编译安装

cd redis-2.8.17/
make ## 编译

三、Redis配置设置

## 拷贝配置和启动命令到快捷目录
sudo cp redis.conf /etc/
cd src/ ## 启动命令在src目录
sudo cp redis-benchmark redis-cli redis-server /usr/bin/

上面是方便启动罢了。

Redis配置设置

vim /etc/redis.conf

将 daemonize 从 no 修改成 yes,运行为了守护进程。

(ps:vim 搜索文本 esc — :/daemonize)

四、启动Redis

redis-server /etc/redis.conf

五、 验证

ps -ef | grep redis
redis-cli
ping ## response 'pong'
可以看到起进程。

欢迎点击我的博客及GitHub — 博客提供RSS订阅哦!———- http://www.bysocket.com/ ————-https://github.com/JeffLi1993 ———-

微         博:BYSocket  豆         瓣:BYSocket  FaceBook:BYSocket  Twitter    :BYSocket

Posted in 清文

随笔,名为无题

有道云数据丢失,整理发现 一些好玩的随笔
2015.11.11
夜有时候是亮的,因为有你的眼睛
2015.10.16
上班路上,走在盲人道上的我
脚底按摩着,耳朵听着歌,也在挺享受和盲人一样的路。
2015.09.16
和谐号像一条温柔的蛇,蛇想回家了
2015.09.02
不仅仅是花儿是向着阳光的
早上三叶草的叶子面朝着阳光
2015.07.27
鸡汤,自己熬的。
多年后才觉得,和父母在一起的时候,真的很少;多少年后,在异乡独居,才想起那时候的宿舍。
我在阳台看天空
北极星的地方朝向你
2015.07.26
好像,一切都没有意义
好像,忘了初心,初心里面的梦想
2015.06.07
路很多,沙子的、柏油的、水泥的
还有两根铁轨的
2015.03.30
健身房,镜子里面的自己的脸
嘴唇有着血的颜色
当你病了,嘴唇也会累了
2015.03.16
为了挂衣服的线两头,紧紧挂在树干
多年以后,树依旧向上生长
把线吃进去了
2015.03.15
树藤儿包裹着冰冷的铁栏
2015.02.24
妈的故事
2015.02.24

人应该有梦
有梦就别怕疼痛
让上次犯的教训
反省出梦想
2015.02.17
年30前晚,站在家村的桥上
年味 在哪里
只有取悦小朋友的小烟火。
正态分布的人生 酒绿灯红