常用命令:   Linux环境下
=======================================================================

服务器启动:./redis-server ../redis.conf & 
客户端启动: ./redis-cli
服务器关闭:./redis-cli shutdown 
(最大的执行效率为:10w/s)
--------------------------------------------------------------------------
中文乱码问题解决方法:启动客户端输入 ./redis-cli --raw 
==========================================================================
1.基本密令:
   ping  查看是否链接到服务器
   dbsize 查看数据库中的数据量 redis默认有16个数据库 (修改数量改redis.conf文件)
   select (1-16) 切换数据库
   flushdb  清空当前数据库
   exit/quit     退出客户端
   keys *    查看所有的key (支持统配符:keys k* ,keys wo?d)
   exists key key (判断是否存在key)
   ttl key (查看还剩的存活时间) 默认永久
   expire key n  设置key的存活时间n秒
-----------------------------------------------------------------------
*****解决redis内存不管的方式:换内存大的redis,分存到多个redis服务器*****
-----------------------------------------------------------------------
   type key 显示key对应的key的数据类型
   del key key key 删除对应的key和value值

2.数据类型的命令(redis可以存放任何形式的字符串)
------------------String-----------------------------------------------
  set key value  存放
  get key        拿出
  incr key        将key的对应的整数+1
  decr key        将key的对应的整数-1
  key不存在时默认创建并赋值为0,然后加减1
  append key value 追加
  strlen key 求长度
  getrange key x y  取x到y位的字符 (x<y)
  setrange key x value  从x位开始替换 (替换的字符串时value值)
  mset key1 value1 key2 value2 同时设置多个key
  mget key1 key2 同时设置多个key 
------------------------Hash(一般存放的是java对象)------------------------ 
 hset key filed value   设置hash数据的key和value   flied相当于map中的key
 hget key filed          获取对应的hash数据值
 hmset key filed1 value1 filed2 value2 设置多个对象和值
 hmget key filed1 filed2     获取多个字段的值
 hgetall key                 显示所有的字段的值
 hdel   key filed            删除对应的字段值
 hkeys  key                  显示所有的key
 hvals  key                  显示所有的值
 hexists key firled          检查是否存在                       
---------------------------List-----------------------------------------
 (rpush)lpush key values     按顺序存放values值 注意添加的顺序
  lrange key start n          从start开始取子串
  lindex key index            取出指定的下标的值
  llen key                    统计长度
  lrem key count n            删除count个n成员
  lset key index value        替换index的值
  linsert key before|after pivot values  在指定的值前或者后插入值
---------------------------Set----------------------------------------
  sadd key values             添加set集合成员
  smembers key                查看成员
  sismember key values        判断是否存在values
  scard key                   统计个数
  srem key values             删除成员
  srandmember key n           随机显示n个成员 (n<0可能重复)
  spop key n                  随机删除n个成员
  sinter key1 key2            取集合交集 
-------------------------Zset(set排序了)------------------------------------------
 zadd key n xxx n xxx n xxx    添加集合 (n:数字 xxx:字符串) 
 zrange key strat n  withscores  显示区间类的成员和分数(min->max)
 zrevrange key start stop        显示区间类的成员和分数(max->min)
 zrem key xxx xxx                删除xxx xxx成员
 zrangebyscore key n n++         显示子在(N,N+)区间的值(-inf:最小值
 zrangebyscore key n n++ limit n n++  取出对应值然然后分页                                                         +inf:最大值)
 zcount key min max               统计(min,max)的成员个数 
  ------------------------------------------------------------
   zrevrangebyscore key +inf 2000 withscores limit 1 5 
     降序取出最大值到2000的成员中的5个  
   zrangebyscore key -inf  5000 withscores limit 1 5 
     降序取出最小值到5000的成员中的5个      
---------------------事务----------------------------------------------           
    multi 事务开始     (服务端开启一定的空间来存放命名)
    exec  事务执行     (服务器开始按顺序执行)
    discard 事务放弃   
    注:如果开启事务的过程中出现语法错误事务自动放弃
        如果语法没错但是实际的操作不符合数据本身事务也会执行
        输入discard视为自动放弃,事务也不执行    
    watch机制:意思是当a事务对数据xx做修改时会监控xx的值是否在a执行之前
    有变化,如果没有a事务就会对xx进行操作如果有a主动放弃对xx的操作
   (即:多个事务在同一时间对数据a进行修改他们就会竞争a的修改权谁拿到谁改)  
--------------------------持久化(保证数据一直存在)------------------------------      
       RDB机制:在指定的时间间隔内将数据集快照写入磁盘中,数据恢复时在读到内存
       默认开启的时间:300秒内数据改变10次
            缺点:可能会是数据丢失(做缓存无影响)
       AOF机制:默认记录对数据的修改的操作,不记录读取
               AOF的速度慢,占用内存多,安全性高
               RDB:速度快占内存高但是安全性低一些
       使用方式:做数据缓存 RDB
                 做数据库   AOF 
       切换方式:修改redis.conf文件开启AOF即可
主从复制:多个redis服务器处理一种业务,主要的redis负责数据读取,其他的
          链接从redisf负责存入,同时主redis可以写入同时将数据与其他从
          redis数据同步但是其他的从redis不能够写入数据
       info replication     查看关系信息
       slaveof ip port   设置从服务器
       slaveof no one    升级为主服务器      
-------------------------------哨兵机制------------------------------------------------
        redis-sentiner  redis自带的监控程序的运行情况,可以监控redis的主从
        redis服务器的运行情况,如果主服务器发生故障自动更改生成的从服务器的
        一台升级为主,剩下的从服务器链接到新的主服务器
---------------------------------------------------------------------------------------

JAVA代码控制Redis:

<dependencies>
      <dependency>
          <groupId>redis.clients</groupId>
          <artifactId>jedis</artifactId>
          <version>2.9.3</version>
      </dependency>
      <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-pool2</artifactId>
          <version>2.6.0</version>
      </dependency>
  </dependencies>

代码:

package com.atchengdu.redis;

import redis.clients.jedis.Jedis;

import java.util.List;

public class testspringredis {
    public static void main(String[] args) {
        //创建jedis对象 然后操作jrdis
        String host ="192.xxx.xxx.xxx";//redis的主机地址
        int port =6379;//redis的端口号
        Jedis jedis=new Jedis(host,port);
        //设置访问密码
        jedis.auth("123456");
        //操作数据
        jedis.set("break","豆浆油条");
        String aBreak = jedis.get("break");
        System.out.println(aBreak);

        jedis.mset("lunch","红烧肉","dinner","小面");
        List<String> mget = jedis.mget("lunch", "dinner", "break");
        for(String s:mget){
            System.out.println(s);
        }
        //查询id=1 student key == student:1
        if(jedis.exists("student:1")){
            String student =jedis.get("student:1");
        }else {
            //访问数据库
            String student="";
            jedis.set("setduent",student);
        }
    }
}

创建线程池的方式保证安全性:

package com.atchengdu.redisutils;

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

public class RedisGet {
    //jedispool对象
    private static JedisPool pool;
    public static JedisPool open(String host,int port){
        if(pool==null){
            //设置jedispool线程池属性
            JedisPoolConfig config =new JedisPoolConfig();
            //设置最大的线程数量
            config.setMaxTotal(100);
            //设置空闲数
            config.setMaxIdle(2);
            //设置检查项,避免null的情况
            config.setTestOnBorrow(true);
            //创建线程池
            pool=new JedisPool(config,host,port,6000,"123456");
        }
        return pool;
    }
    //关闭
    public  static  void  close(){
        if (pool!=null){
            pool.close();
        }
    }
}
package com.atchengdu.redis;

import com.atchengdu.redisutils.RedisGet;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.List;

public class Testrdeis {
    public static void main(String[] args) {
        String host ="xx.xxx.xxx.xxx";//redis的主机地址
        int port =6379;//redis的端口号
        Jedis jedis=null;
        JedisPool pool=null;
        try {
            //获取线程池
           pool= RedisGet.open(host,port);
           //获取jedis对象
           jedis = pool.getResource();
            List<String> mget = jedis.mget("lunch", "dinner", "break");
            for(String s:mget){
                System.out.println(s);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //使用结束之后把jedis对象放回去其他的地方可以接着使用
            if(jedis!=null){
                jedis.close();
            }
            //关闭poll
            RedisGet.close();
        }

    }
}