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事务执行过程中如果崩溃,不一定能够恢复。

  • 相关阅读:
    Educational Codeforces Round 10 C. Foe Pairs 水题
    Educational Codeforces Round 10 B. z-sort 构造
    CDOJ 1048 Bob's vector 三分
    Educational Codeforces Round 10 A. Gabriel and Caterpillar 模拟
    第14届电子科大初赛民间盗版部分题目题解
    HDU 5654 xiaoxin and his watermelon candy 离线树状数组 区间不同数的个数
    HDU 5653 Bomber Man wants to bomb an Array. dp
    HDU 5652 India and China Origins 二分+并查集
    HDU 5651 xiaoxin juju needs help 数学
    HDU 5650 so easy 数学
  • 原文地址:https://www.cnblogs.com/chxwkx/p/11227490.html
Copyright © 2011-2022 走看看