zoukankan      html  css  js  c++  java
  • linux redis安装及JAVA使用jedis

    一、redis安装

    1.安装redis
      将redis安装包放到指定目录下。并用tar -zxvf redis.*****.tar.gz解压
    2.想把redis安装到哪里,就在哪里创建redis文件夹。
      如 mkdir /home/chx/allSoftCert/redis
    2.进入解压后的目录内,如redis4.0.0
    3.cd src
    4.sudo make install PREFIX=/home/chx/allSoftCert/redis
    5.cp ../redis.conf /home/allSoft/redis/
    6.运行测试:./home/chx/allSoftCert/redis/bin/redis-server /home/chx/allSoftCert/redis/redis.conf
      错误:如果发生make[1]: Entering directory错误,则执行make distclean后再次安装
    7.开启远程的端口
      ptables -I INPUT -p tcp --dport 6379 -j ACCEPT
      iptables save
    8.修改密码
      vi /home/chx/allSoftCert/redis/redis.conf

    注释bind 127.0.0.1
    修改 daemonize no 为 daemonize yes
    解注释 requirepass foobared 并修改为 requirepass 123456

    9.接下里就可以进行java测试了

    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;

    public class MainJedis {

    private static final String REDIS_IP = "192.168.0.156";
    private static final String REDIS_AUTH = "123456";
    private static final int MAX_TOTAL = 100;//最大连接数
    private static final int MAX_ID_LE = 10;//最大空闲数
    private static final int REDIS_DUAN_KOU = 6379;

    public static void main(String[] args) {

    JedisPoolConfig config = new JedisPoolConfig();

    config.setMaxTotal(MAX_TOTAL);//设置最大连接数

    config.setMaxIdle(MAX_ID_LE);//设置最大空闲数

    JedisPool pool = null;

    Jedis jedis =null;

    try {

    pool = new JedisPool(config,REDIS_IP,REDIS_DUAN_KOU);

    jedis = new Jedis(REDIS_IP,6379);

    jedis.auth(REDIS_AUTH);

    jedis.set("chx", "boy");

    System.out.println(jedis.get("chx"));

    }catch (Exception e) {

    e.printStackTrace();

    }finally {

    if(jedis!=null) {

    jedis.close();

    }
    if(pool!=null) {

    pool.close();

    }

    }

    }

    }

    pom.xml对应如下:

    <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>JedisTest</groupId>
    <artifactId>firstJedis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>firstJedis</name>
    <url>http://maven.apache.org</url>

    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
    <dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
    </dependency>
    </dependencies>
    </project>

     二、JAVA中使用redis

    1.java对象存储在redis内。

    两种方式:

    (1).序列化和反序列化。

    (2).转换为json存储。

    2.redis的几种数据结构

    String: 字符串

    Hash: 散列

    List: 列表

    Set: 集合

    Sorted Set: 有序集合

    3.Jedis基础命令

    jedis.del("key","key2");//删除key

    jedis.auth(REDIS_AUTH);//操作密码

    jedis.set("chx", "boy");//放入普通的key-value

    jedis.exists("chx");//判断是否存在某个key

    System.out.println("系统中所有键如下:");

    //查询系统所有key值

    Set<String> keys = jedis.keys("*");

    Iterator<String> it=keys.iterator();

    while(it.hasNext()){

      System.out.println(it.next());

    }

    //设置key值的储存时间,单位秒

    jedis.expire("chx", 2);

    //获取key的存储时间,永久生存或者不存在的都返回-1

    jedis.ttl("chx");

    //移除key的生存时间

    jedis.ttl("chx");

    jedis.type("chx"));//查看key所储存的值的类

    jedis.rename("old", "new");//修改key值

    jedis.mset("chx2", "value2", "chx3", "value3");//一次性增加多个key-value

    List<String> mget = jedis.mget("chx","chx1","chx2","chx3");//一次性获取多个value

    jedis.setnx("chx", "change");//放入key-value时防止覆盖旧值的方法

    jedis.flushDB();//清空DB所有数据

     

    Jedis 列表(List):

    jedis.rpush("myList", "1","2","3","a");//从右边添加,即尾插入

    jedis.lrange("myList", 0, -1);//从左边获取

    jedis.lrem("myList", 2, "1");//从左侧删除2个值为1的数据

     

    Jedis集合Set

    System.out.println("清空库中所有数据:" + jedis.flushDB());

    jedis.sadd("mySet", "1","2","3");

    System.out.println(jedis.smembers("mySet"));


    Jedis hash

    System.out.println("清空库中所有数据:" + jedis.flushDB());

    jedis.hset("myHash", "name", "chx");

    Map<String, String> users = new HashMap<String, String>();

    users.put("age", "18");

    jedis.hmset("myHash", users)

    System.out.println(jedis.hgetAll("myHash"));

      4.切片和非切片连接池的概念

        JedisPool连一台Redis,ShardedJedisPool连Redis集群,通过一致性哈希算法决定把数据存到哪台上。

    5.redis有密码的情况下关闭redis-server服务

      ./redis-cli -a 123456 shutdown

    6.集群下使用reids:

      查看此文章

    三、常用redis数据类型

    1.字符串:

    在Redis中字符串类型的Value最多可以容纳的数据长度是512M。

    set xx(key) xx(value),返回OK,如果key存在会覆盖。

    get xx(key),只能获取String 类型的,不是String 会报错。

    append key value:在原有的value后追加;如果该key不存在,则重新创建一个key/value。

    msetnx key1 value1 key2 value2:如果key1存在,则key2也放不进去。只有都不存在时才能放进去。

    2.list:

    lset xx(key) index xx(value):设置链表中的index的脚标的元素值,0-链表的头元素,-1-链表的尾元素。

    lrem key count value:删除count个值为value的元素,count>0,从头向尾删除count个值为value的元素,count<0,则从尾向头删除。如果count=0,则删除链表中所有等于value的元素。

    linsert key before|after pivot value:在pivot元素前|后插入value。

    3.set:

    Set集合中不允许出现重复的元素。

    smembers xx(key):获取set中所有的成员。

    scard xx(key):获取set中成员的数量。

    sismember xx(setX) xxv(value):判断xxv是否在setX中,1存在,0不存在。

    srem xx(setX) xxv(value):删除value。

    sdiff set1 set2:返回set1中set2没有的数据(既差集,按顺序返回)。

    4.Hash:

    结构为hash(key)-field(多个)-value(多个)。

    每一个Hash可以存储 232 - 1 键值对(40多亿)。

    hset hash field value:为指定的hash设定field/value对(键值对)。如果哈希表不存在,将创建HASH并进行操作。设置成功返回 1,覆盖返回0。

    hget hash field:返回指定hash的key的值。

    hexists hash field:判断指定的hash中的field是否存在。

    hlen hash:hash中field的数量。

    四、分布式情况下存储用户状态

    当单台机器不能满足性能提升时,大多采用分布式,但是session是基于cookie进行获取的,导致不同机器的jsessionid会不同,而导致用户访问不同机器时会重新登入。

    所以一般用redis等内存存储的数据库进行session存储。原理是将sessionid为key值,用户信息为value进行存储。每次访问先去redis获取用户信息,没有说明是非法登入。同时redis可以设置数据的过期时间,由此可以基本实现原session功能。

    五、Redis面试相关

    Redis是高可用,NoSQL(not-only sql,泛指非关系型数据库)的数据库。

    1.缓存穿透:就是由于大量访问不在redis的数据(比如非法传入ID为-1),导致每次都需要去数据库查询,导致数据库无法承载而崩溃。此时重启都无法解决,因为新的访问仍会导致崩溃。这里可以用布隆过滤器做处理,布隆过滤器是一个 bit 向量或者说 bit 数组,数据的hash的每个数值位(如Hash值等于147)散落在bit数组内。所以查询时如果1、4、7位有值说明此数据可能存在(之所以不是一定存在是因为Hash冲突),1、4、7位不存在的则一定不存在。参考此文,非常不错

    2.缓存雪崩:由于热点数据(注意是热点)同一时间失效,导致大量访问涌入时都访问的数据库而导致崩溃。

    3.缓存击穿:由于一个热点数据访问量过大,而此数据失效的瞬间导致击穿崩溃。

    4.Redis是单线程,至于为什么这么快。首先由于Redis的操作都基于内存,所以读写耗时问题可以忽略,更多的是CPU及网络带宽影响其上下限,单线程避免了CPU不必要的上下文切换和竞争条件,也避免了锁的耗时问题。再者,Redis采用Key-Value存储,基本读是O(1)的时间复杂度。

    5.有关主从复制:从节点仅提供读操作,主节点提供写操作。从节点中的定时任务发现主节点信息,连接建立后,主节点将所有数据发送给从节点(数据同步)。主节点把当前的数据同步给从节点后,便完成了复制的建立过程。接下来,主节点就会持续的把写命令发送给从节点,保证主从数据一致性。

    6.Redis分片及Hash槽相关:首先Redis采用Hash槽来确定数据分配到集群的哪个主机,每个节点的槽位(如0-5000)是需要人工配置的,最大槽位为2的14次方即16384。第一个槽位和最后一个槽位相连,形成一个圆环,需要放入新数据时,利用crc16求出hash值,对16384求余而确定放入那个节点。之所以不用一致性hash是为了避免数据倾斜问题。参考此篇文章。所以每次扩展或宕机时,只需要把该节点的所有槽位转移到新节点即可。

    7.有关哨兵:哨兵是一个独立的进程,顾名思义,哨兵主要用于监控-Master和Slave是否运作正常、提醒-通过API向管理员或者其他应用程序发送通知、自动故障迁移-将失效Master的其中一个Slave升级为新的Master(就像电视里的巡逻、吹哨、发现危险拿起武器操作一番)。多个哨兵使用投票协议(agreement protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。

    哨兵个数最少是三个,并且建议是奇数个。主要是为了投票主节点是否下线,少数服从多数。几个哨兵投票为多数的配置,在sentinel.conf里配置sentinel monitor开头的一行,最后一个数字即是投票数。

    哨兵默认端口号:26379  redis默认端口号6379

    redis是没有回滚的。其事务主要是为了能够全部执行正确的操作。如果在执行时出错,如转账功能,是不会回滚的(效率第一的理念)。但是运行前的入队操作,有语法错误是不会提交的。

    8.Redis持久化:就两种,一种是RDB(Redis DataBase),一种是AOF(Append Only File)。

    RDB:指定时间间隔内,将内存的数据集快照,保存到磁盘。Redis会创建一个子进程,将快照写入临时文件中,等到持久化结束就覆盖上一次的备份。此过程主进程不进行IO操作。如上所述,很有可能丢失最后一次备份。所以适合完整性和一致性要求不高的情况,Fork时候是克隆当前主进程,导致两倍的内存占比,需要考虑内存配置。在Redis.conf可以配置文件名及自动备份时间。

    AOF:利用文件保存所有写操作,只追加不能修改,Redis重启就会读取此文件进行恢复。如果遇到断电等aof文件错乱的情况,可以用redis-check-aof --fix 文件名 来修复。所以也会丢失近一段时间的数据,不过一般比RDB丢失的少。在redis.conf里可修改当占用多大存储(auto-aof-rewrite-min-size 64mb 默认64兆)时进行压缩及比上次膨胀百分比(auto-aof-rewrite-percentage 100默认100%),

    9.事务:MULTI开始事务,添加指令(任何符合规范的命令get set等),EXEC执行事务。一个命令在录入时失败则全失败(即EXEC之前失败)!如果是运行时失败则其他的是成功的!!

    Watch 一个或多个key表示监视一个或多个key,执行exec命令后,锁都被释放。如果期间有其他人改动过这些key的value值,则事务被打断。

    10.关于ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)是相对于事务而言。Redis保证了数据的一致性(内存模式下,重启后为空,不会一部分保存一部分未保存)、隔离性(单线程不涉及其他事务),实现了部分原子性(如第九条,EXEC可以在运行失败时完成其他成功语句),但是没有持久性,因为Redis事务执行过程中如果崩溃,不一定能够恢复。

  • 相关阅读:
    leetcode 203
    vim插件管理器vundle
    centos7看电影
    getopt
    iOS/object-c: 枚举类型 enum,NS_ENUM,NS_OPTIONS
    "ALView+PureLayout.h"
    UIPageViewController教程
    (Mac ox 10.11+) CocoaPods安装,卸载,使用说明
    CocoaPods集成到Xcode项目中的步骤
    label_设置行距、字距及计算含有行间距的label高度
  • 原文地址:https://www.cnblogs.com/chxwkx/p/11227490.html
Copyright © 2011-2022 走看看