redis

作者 knight 日期 2018-02-06
redis

我知道很多人的欲望很难突破,我也不赞成用压抑的方式去对待欲望。欲望是需要被穿越的,而穿越的方法有时候就是追逐、满足它。到了一定时候,你会像我一样精疲力竭,坐回到自己的位子上,才发现,原来我想要的一切,都已经在我出发地方等着我了。

redis概述

关于关系型数据库和nosql数据库

NoSQL(not only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型数据库。
关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据 库是基于特殊的结构,并将数据存储到内存的数据库。从性能上而言,nosql数据库 要优于关系型数据库,从安全性上而言关系型数据库要优于nosql数据库,所以在实 际开发中一个项目中nosql和关系型数据库会一起使用,达到性能和安全性的双保证。

为什么要使用Redis

随着互联网的发展,对数据产生了很多新的需求:

  1. 对数据库高并发读写的需求
  2. 对海量数据的高效率存储和访问的需求
  3. 对数据库的搞可扩展性和高可用性的需求

redis在Linux上的安装

1)安装redis编译的c环境,yum install gcc-c++
2)将redis-2.6.16.tar.gz上传到Linux系统中
3)解压到/usr/local下 tar -xvf redis-2.6.16.tar.gz -C /usr/local
4)进入redis-2.6.16目录 使用make命令编译redis
5)在redis-2.6.16目录中 使用make PREFIX=/usr/local/redis install命令安装redis到/usr/local/redis中
6)拷贝redis-2.6.16中的redis.conf到安装目录redis中
7)启动redis 在bin下执行命令redis-server redis.conf
8)如需远程连接redis,需配置redis端口6379在linux防火墙中开发
/sbin/iptables -I INPUT -p tcp –dport 6379 -j ACCEPT
/etc/rc.d/init.d/iptables save
将redis.conf文件中的daemonize从false修改成true表示后台启动
使用命令查看6379端口是否启动ps -ef | grep redis

Java操作Redis

一般通过Jedis操作

单实例连接

@Test
//获得单一的jedis对象操作数据库
public void test1(){

    //1、获得连接对象
    Jedis jedis = new Jedis("192.168.186.131", 6379);

    //2、获得数据
    String username = jedis.get("username");
    System.out.println(username);

    //3、存储
    jedis.set("addr", "北京");
    System.out.println(jedis.get("addr"));

    //4、释放资源
    jedis.close();    
}

通过jedis的pool获得jedis连接对象

@Test
public void test2(){
    //0、创建池子的配置对象
    JedisPoolConfig poolConfig = new JedisPoolConfig();
    poolConfig.setMaxIdle(30);//最大闲置个数
    poolConfig.setMinIdle(10);//最小闲置个数
    poolConfig.setMaxTotal(50);//最大连接数

    //1、创建一个redis的连接池
    JedisPool pool = new JedisPool(poolConfig, "192.168.186.131", 6379);

    //2、从池子中获取redis的连接资源
    Jedis jedis = pool.getResource();

    //3、操作数据库
    jedis.set("xxx","yyyy");
    System.out.println(jedis.get("xxx"));

    //4、关闭资源
    jedis.close();
    pool.close();

}

封装连接池工具类连接

public class JedisPoolUtils {

    private static JedisPool pool = null;

    static{            
        //加载配置文件
        InputStream in = JedisPoolUtils.class.getClassLoader().getResourceAsStream("redis.properties");
        Properties pro = new Properties();
        try {
            pro.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //获得池子对象
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxIdle(Integer.parseInt(pro.get("redis.maxIdle").toString()));//最大闲置个数
        poolConfig.setMinIdle(Integer.parseInt(pro.get("redis.minIdle").toString()));//最小闲置个数
        poolConfig.setMaxTotal(Integer.parseInt(pro.get("redis.maxTotal").toString()));//最大连接数
        pool = new JedisPool(poolConfig,pro.getProperty("redis.url") , Integer.parseInt(pro.get("redis.port").toString()));
    }

    //获得jedis资源的方法
    public static Jedis getJedis(){
        return pool.getResource();
    }

    public static void main(String[] args) {
        Jedis jedis = getJedis();
        System.out.println(jedis.get("xxx"));
    }    
}

Redis的常用命令

redis是一种高级的key-value的存储系统
key是字符串类型,尽可能满足如下几点:

1. key不要太长,最好不要操作1024个字节,这不仅会消耗内存还会降低查找        效率
2.  key不要太短,如果太短会降低key的可读性
3. 在项目中,key最好有一个统一的命名规范(根据企业的需求)

value支持五种数据类型:

1. 字符串型 string
2. 字符串列表 lists
3. 字符串集合 sets
4. 有序字符串集合 sorted sets
5. 哈希类型 hashs

存储字符串string
字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这 便意味着该类型可以接受任何格式的数据。字符串类型的Value最多可以容纳的数据长度是512M

1. set key value:设定key持有指定的字符串value,如果该key存在则进行覆盖    操作。总是返回”OK”
2. get key:获取key的value。如果与该key关联的value不是String类型,redis    将返回错误信息,因为get命令只能用于获取String value;如果该key不存在,返    回null。
3. getset key value:先获取该key的值,然后在设置该key的值。
4. incr key:将指定的key的value原子性的递增1.如果该key不存在,其初始值    为0,在incr之后其值为1。如果value的值不能转成整型,如hello,该操作将执    行失败并返回相应的错误信息。
5. decr key:将指定的key的value原子性的递减1.如果该key不存在,其初始值    为0,在incr之后其值为-1。如果value的值不能转成整型,如hello,该操作将执    行失败并返回相应的错误信息。

redis数据类型list
arraylist和list的区别
arraylist查询快,list更删改快