redis

来源:互联网 发布:淘宝活动报名网站 编辑:程序博客网 时间:2024/05/29 15:32

    Mysql

            Memcache(缓存)+Mysql+垂直拆分

                主从复制读写分离    

                        分表分库+水平拆分+mysql集群

                                    NoSql(不仅仅是ql)

背景:    海量多样实时的大数据,    高并发,高可扩,高性能的互联网需求

NoSql的四大分类:

            KV键值  新浪(BerkeleyDB+redis) 美团(redis+tair)  阿里,百度(memcache+redis)

            文档型数据库   CouchDB MongoDB

            列存储数据库   HBase,分布式文件系统

            图关系型数据库    Neo4J InfoGrid 社交网络

传统的ACID

        A Atomicity 原子性       C Consistency 一致性

        I  Isolation   独立性       D  Durability  持久性

分布式数据库的CAP

         C Consistency 强一致性  A Availability可用性  P Partition tolerance 分区容错性

为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案

           基本可用(Basically Available)
           软状态(Soft state)
           最终一致(Eventually consistent)


redis安装: 

需要c的编译器 yum install gcc-c++

将tar上传 解压到local     tar  -zxvf   (rides的tarbao) -C  /usr/local

进入 解压文件夹 make

安装 make PREFIX=/usr/local/redis install

将源码包的redis.conf复制到安装的bin目录下    cp redis.conf  ../redis/bin

 后台启动redis服务   ./redis-server

启动redis-cli  ./redis-cli

通过java程序对redis 简单操作

package com.wpx.redis;import org.junit.jupiter.api.Test;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;/** *  * @author wangpx                    __                    __ *                  \ \        /\        / / *                \ \      /\ \      / / *                   \ \    / /\ \    / / *                  \ \  / /  \ \  / / *                   \  /\/    \ \/ / *                    \/\/      \/\/ * *通过java程序访问Redis数据库 * 套路 *     获取对象 *      操作对象 *     Y/N 关闭资源 *  * 能不能封装起来便于下次使用 */public class RedisTest {    @Test    public void test01() {        //java+redis  jedis            //获得对象            Jedis jedis=new Jedis("111.230.21.142",6379); //这个大家也可以访问两天 我装在了腾讯的免费主机上        //获得数据        String name=jedis.get("name");        System.out.println(name);                jedis.set("age", "20");        System.out.println(jedis.get("age"));            }    //通过jedis 的pool获得jedis连接对象     @Test    public void test02() {        //2.当获对象发现需要一顿乱配置            //1.还是先获取对象        JedisPoolConfig config=new JedisPoolConfig();            //2.还是一顿乱配置        config.setMaxIdle(50);  //设置最大闲置个数        config.setMinIdle(10);  //设置最小闲置个数                config.setMaxTotal(40); //最大连接数                // 1.获取对象        JedisPool pool =new  JedisPool(config,"111.230.21.142",6379);        //3.从池子中获取redis的连接资源         Jedis jedis=pool.getResource();        //4.对对象进行相关操作        jedis.set("pool", "JedisPool");        System.out.println(jedis.get("pool"));        //5.关闭资源        jedis.close();        pool.close();   //实际运用场景pool一般不管    }}


 

来个简单的封装

package com.wpx.redis;import java.io.IOException;import java.io.InputStream;import java.util.Properties;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;public class JedisPoolUtils {    private static JedisPool jedisPool=null;    /**     * 配置一个资源文件 redis.properties        redis.maxIdle=40        redis.minIdle=10        redis.maxTotal=40        redis.ip=111.230.21.142        redis.port=6379        通过  加载配置资源赋值     */    static {                //2.当获对象发现需要一顿乱配置        //1.还是先获取对象    JedisPoolConfig config=new JedisPoolConfig();        //2.还是一顿乱配置    config.setMaxIdle(10);  //设置最大闲置个数    config.setMinIdle(3);  //设置最小闲置个数    config.setMaxTotal(20); //最大连接数    // 1.获取对象    jedisPool =new  JedisPool(config,"111.230.21.142",6379);    }        //获取Jedis对象    public static Jedis getJedis() {        return jedisPool.getResource();    }        public static void main(String[] args) {        System.out.println(    getJedis().get("pool"));    }} 


1.字符串的简单操作

数值的增减

value的值追加

    免费的主机就是会一直断

2.哈希

结构相当于Map<key1,Map<key11,value>>

也可以理解为二重菜单  大菜单 二级菜单 具体产品

设多个值

取出全部

删除年龄

是否存在

所有key ,val

3.list

类似于Map<key,List<value>>

左 l 右 r 相对应

弹栈

当然也会有

list删除 需要说明一下   lrem  mylist(list的key)  2(删除的数量) a

        数量前加负号 表示从右边开始删除 -2 a 表示从右开始删除2个val为a的数据

4.set

容易理解不同于list的就是他是唯一的

差集   一个set 减去和 第二set 共有的部分

5.sortedset

前面的数字为权重

实际上还可以查询带权重

当然一些类似操作没必要过多解释

 

6.在五种操作的类型中的通用操作

?代表一个字符 *为 任意字符

    设置查看过期时间

 

7.redis的移库操作

先对redis的数据库有个大体的概念

将myset移到一号库

删除所有

8.消息订阅和发布

subscribe wpx(订阅的频道)

publish wpx content(发布的内容)

9.redis的事务

multi:开启事务用于事务的开始,之后执行的命令都被存入到命令队列,直到执行exec

exec:提交事务,类似于关系型数据库中的commit

discard:事务回滚

10.redis的持久化

redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式,可以单独使用其中一种或一起使用 

    RDB持久化(默认支持,无需配置)

指定时间间隔内将内存中的快照写入磁盘

900秒 一个key发生变化  一次快照

 AOF

像记录日志那样记录服务器的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库的数据是完整的

默认是关闭的

1.每次有数据修改发生变化都会写入AOF文件

2.每秒同步一次,

3.从不同步

 

Redis的主从复制:

    将redis.conf复制一份  修改参数pid  指定端口 log文件名字 dump.rdb名字

 

主机挂了,回来还是主机

从机挂了,回来需要重新连接

从机不具备写的能力

从机连接之前的数据也可以拿到

SLAVEOF no one

停止与其他数据库的同步转成主数据库

        复制原理:

    slave启动成功连接到master后会发送一个sync的命令

Master接到命令启动后台的存盘进程,同时收集所有收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步,每次重新建立关系都会进行一次完全同步

哨兵模式

新建一个  用于配置哨兵

sentinel.conf

开启哨兵

类似于直接插入排序的监视哨,当主机挂掉,会从丛机中投票决定谁成为master

 Redis集群

新建一个文件夹redis-cluster

把redis的bin文件全复制过去改个名字1-6自己分的清楚就好了

找到redis的安装目录src下找到rb的脚本

把相关的全部复制到集群的目录下面

安装ruby和相关依赖 

yum install ruby

gem install redis-3.0.0.gem

写个批处理

顺带的把执行的文本写下来到read.me

执行操作

原创粉丝点击