zoukankan      html  css  js  c++  java
  • redis安装

    安装过程如下

    性能测试结果:

    SET操作每秒钟 110000 次,GET操作每秒钟 81000 次,服务器配置如下:

    Linux 2.6, Xeon X3320 2.5Ghz.

    stackoverflow 网站使用 Redis 做为缓存服务器。

    安装过程:

    Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。

    Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。

    一、下载最新版

    wget http://redis.googlecode.com/files/redis-2.0.0-rc4.tar.gz

    二、解压缩

    tar redis-2.0.0-rc4.tar.gz

    三、安装C/C++的编译组件(非必须)

    apt-get install build-essential

    四、编译

    cd redis-2.0.0-rc4
    make

    make命令执行完成后,会在当前目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-stat,它们的作用如下:

    • redis-server:Redis服务器的daemon启动程序
    • redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
    • redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
    • redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况 

    五、修改配置文件

    /etc/sysctl.conf

    添加

    vm.overcommit_memory=1

    刷新配置使之生效

    sysctl vm.overcommit_memory=1 

    补充介绍:

     **如果内存情况比较紧张的话,需要设定内核参数:
    echo 1 > /proc/sys/vm/overcommit_memory

     内核参数说明如下:

    overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2。
    0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
    1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
    2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

     **编辑redis.conf配置文件(/etc/redis.conf),按需求做出适当调整,比如:
    daemonize yes #转为守护进程,否则启动时会每隔5秒输出一行监控信息
    save 60 1000 #减小改变次数,其实这个可以根据情况进行指定
    maxmemory 256000000 #分配256M内存


    在我们成功安装Redis后,我们直接执行redis-server即可运行Redis,此时它是按照默认配置来运行的(默认配置甚至不是后台运 行)。我们希望Redis按我们的要求运行,则我们需要修改配置文件,Redis的配置文件就是我们上面第二个cp操作的redis.conf文件,目前 它被我们拷贝到了/usr/local/redis/etc/目录下。修改它就可以配置我们的server了。如何修改?下面是redis.conf的主 要配置参数的意义:
    • daemonize:是否以后台daemon方式运行
    • pidfile:pid文件位置
    • port:监听的端口号
    • timeout:请求超时时间
    • loglevel:log信息级别
    • logfile:log文件位置
    • databases:开启数据库的数量
    • save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。
    • rdbcompression:是否使用压缩
    • dbfilename:数据快照文件名(只是文件名,不包括目录)
    • dir:数据快照的保存目录(这个是目录)
    • appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。
    • appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)

    下面是一个略做修改后的配置文件内容:

    daemonize yes
    pidfile /usr/local/redis/var/redis.pid
    port 6379
    timeout 300
    loglevel debug
    logfile /usr/local/redis/var/redis.log
    databases 16
    save 900 1
    save 300 10
    save 60 10000
    rdbcompression yes
    dbfilename dump.rdb
    dir /usr/local/redis/var/
    appendonly no
    appendfsync always
    glueoutputbuf yes
    shareobjects no
    shareobjectspoolsize 1024

    将上面内容写为redis.conf并保存到/usr/local/redis/etc/目录下

    然后在命令行执行:

    1
    /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

    即可在后台启动redis服务,这时你通过

    1
    telnet 127.0.0.1 6379

    即可连接到你的redis服务。

    六、启动服务并验证

    启动服务器 

    ./redis-server 
    或 
    $redis-server /etc/redis.conf  
    查看是否成功启动 
    $ ps -ef | grep redis   
    或 
    ./redis-cli ping 
    PONG

    七、启动命令行客户端赋值取值 

    redis-cli set mykey somevalue 

    ./redis-cli get mykey 

    八、关闭服务

    $ redis-cli shutdown     

    #关闭指定端口的redis-server  

    $redis-cli -p 6380 shutdown 

    九、客户端也可以使用telnet形式连接。这种方式更经常用于远程验证。

    [root@dbcache conf]# telnet 127.0.0.1 6379 
    Trying 127.0.0.1... 
    Connected to dbcache (127.0.0.1). 
    Escape character is '^]'. 
    set foo 3 
    bar 
    +OK 
    get foo 
    $3 
    bar 
    ^] 
    telnet> quit 
    Connection closed.

     十,如果不想自己搭建redis环境,可以用http://try.redis.io/这个试一下,通过web页面给出了cmd接口,蛮好用

     十一, java 用jedis操作例程

    package org.jzkangta.jedis;
    
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    
    import redis.clients.jedis.Jedis;
    
    public class JedisDemo {
    
        public void test1(){
            Jedis  redis = new Jedis ("192.168.10.64",6379);//连接redis
            redis.auth("redis");//验证密码
    /* -----------------------------------------------------------------------------------------------------------  */        
            /**  KEY操作
             
                 //KEYS
                Set keys = redis.keys("*");//列出所有的key,查找特定的key如:redis.keys("foo")
                Iterator t1=keys.iterator() ;
                while(t1.hasNext()){
                    Object obj1=t1.next();
                    System.out.println(obj1);
                }
                
                //DEL 移除给定的一个或多个key。如果key不存在,则忽略该命令。
                redis.del("name1");
                
                //TTL 返回给定key的剩余生存时间(time to live)(以秒为单位)
                redis.ttl("foo");
                
                //PERSIST key 移除给定key的生存时间。
                redis.persist("foo");
                
                //EXISTS 检查给定key是否存在。    
                redis.exists("foo");
                
                //MOVE key db  将当前数据库(默认为0)的key移动到给定的数据库db当中。如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定key,或者key不存在于当前数据库,那么MOVE没有任何效果。
                redis.move("foo", 1);//将foo这个key,移动到数据库1
                
                //RENAME key newkey  将key改名为newkey。当key和newkey相同或者key不存在时,返回一个错误。当newkey已经存在时,RENAME命令将覆盖旧值。
                redis.rename("foo", "foonew");
                
                //TYPE key 返回key所储存的值的类型。
                System.out.println(redis.type("foo"));//none(key不存在),string(字符串),list(列表),set(集合),zset(有序集),hash(哈希表)
                  
                //EXPIRE key seconds 为给定key设置生存时间。当key过期时,它会被自动删除。
                redis.expire("foo", 5);//5秒过期
                //EXPIREAT EXPIREAT的作用和EXPIRE一样,都用于为key设置生存时间。不同在于EXPIREAT命令接受的时间参数是UNIX时间戳(unix timestamp)。
                
                //一般SORT用法 最简单的SORT使用方法是SORT key。
                redis.lpush("sort", "1");
                redis.lpush("sort", "4");
                redis.lpush("sort", "6");
                redis.lpush("sort", "3");
                redis.lpush("sort", "0");
                
                List list = redis.sort("sort");//默认是升序
                for(int i=0;i<list.size();i++){
                    System.out.println(list.get(i));
                }
                
             */
    /* -----------------------------------------------------------------------------------------------------------  */        
            /**  STRING 操作
            
            //SET key value将字符串值value关联到key。
            redis.set("name", "wangjun1");
            redis.set("id", "123456");
            redis.set("address", "guangzhou");
            
            //SETEX key seconds value将值value关联到key,并将key的生存时间设为seconds(以秒为单位)。
            redis.setex("foo", 5, "haha");
            
            //MSET key value [key value ...]同时设置一个或多个key-value对。
            redis.mset("haha","111","xixi","222");
             
            //redis.flushAll();清空所有的key
            System.out.println(redis.dbSize());//dbSize是多少个key的个数
            
            //APPEND key value如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值之后。
            redis.append("foo", "00");//如果key已经存在并且是一个字符串,APPEND命令将value追加到key原来的值之后。
            
            //GET key 返回key所关联的字符串值
            redis.get("foo");
            
            //MGET key [key ...] 返回所有(一个或多个)给定key的值
            List list = redis.mget("haha","xixi");
            for(int i=0;i<list.size();i++){
                System.out.println(list.get(i));
            }
            
            //DECR key将key中储存的数字值减一。
            //DECRBY key decrement将key所储存的值减去减量decrement。
            //INCR key 将key中储存的数字值增一。
            //INCRBY key increment 将key所储存的值加上增量increment。
            
            */
    /* -----------------------------------------------------------------------------------------------------------  */        
            /**  Hash 操作
            
            //HSET key field value将哈希表key中的域field的值设为value。
            redis.hset("website", "google", "www.google.cn");
            redis.hset("website", "baidu", "www.baidu.com");
            redis.hset("website", "sina", "www.sina.com");
            
            //HMSET key field value [field value ...] 同时将多个field - value(域-值)对设置到哈希表key中。
            Map map = new HashMap();
            map.put("cardid", "123456");
            map.put("username", "jzkangta");
            redis.hmset("hash", map);
            
            //HGET key field返回哈希表key中给定域field的值。
            System.out.println(redis.hget("hash", "username"));
            
            //HMGET key field [field ...]返回哈希表key中,一个或多个给定域的值。
            List list = redis.hmget("website","google","baidu","sina");
            for(int i=0;i<list.size();i++){
                System.out.println(list.get(i));
            }
            
            //HGETALL key返回哈希表key中,所有的域和值。
            Map<String,String> map = redis.hgetAll("hash");
            for(Map.Entry entry: map.entrySet()) {
                 System.out.print(entry.getKey() + ":" + entry.getValue() + "	");
            }
            
            //HDEL key field [field ...]删除哈希表key中的一个或多个指定域。
            //HLEN key 返回哈希表key中域的数量。
            //HEXISTS key field查看哈希表key中,给定域field是否存在。
            //HINCRBY key field increment为哈希表key中的域field的值加上增量increment。
            //HKEYS key返回哈希表key中的所有域。
            //HVALS key返回哈希表key中的所有值。
             
             */
    /* -----------------------------------------------------------------------------------------------------------  */        
            /**  LIST 操作
            //LPUSH key value [value ...]将值value插入到列表key的表头。
            redis.lpush("list", "abc");
            redis.lpush("list", "xzc");
            redis.lpush("list", "erf");
            redis.lpush("list", "bnh");
            
            //LRANGE key start stop返回列表key中指定区间内的元素,区间以偏移量start和stop指定。下标(index)参数start和stop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。你也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。
            List list = redis.lrange("list", 0, -1);
            for(int i=0;i<list.size();i++){
                System.out.println(list.get(i));
            }
            
            //LLEN key返回列表key的长度。
            //LREM key count value根据参数count的值,移除列表中与参数value相等的元素。
             */
    /* -----------------------------------------------------------------------------------------------------------  */        
            /**  SET 操作
            //SADD key member [member ...]将member元素加入到集合key当中。
            redis.sadd("testSet", "s1");
            redis.sadd("testSet", "s2");
            redis.sadd("testSet", "s3");
            redis.sadd("testSet", "s4");
            redis.sadd("testSet", "s5");
            
            //SREM key member移除集合中的member元素。
            redis.srem("testSet", "s5");
            
            //SMEMBERS key返回集合key中的所有成员。
            Set set = redis.smembers("testSet");
            Iterator t1=set.iterator() ;
            while(t1.hasNext()){
                Object obj1=t1.next();
                System.out.println(obj1);
            }
            
            //SISMEMBER key member判断member元素是否是集合key的成员。是(true),否则(false)
            System.out.println(redis.sismember("testSet", "s4"));
            
            //SCARD key返回集合key的基数(集合中元素的数量)。
            //SMOVE source destination member将member元素从source集合移动到destination集合。
             
            //SINTER key [key ...]返回一个集合的全部成员,该集合是所有给定集合的交集。
            //SINTERSTORE destination key [key ...]此命令等同于SINTER,但它将结果保存到destination集合,而不是简单地返回结果集
            //SUNION key [key ...]返回一个集合的全部成员,该集合是所有给定集合的并集。
            //SUNIONSTORE destination key [key ...]此命令等同于SUNION,但它将结果保存到destination集合,而不是简单地返回结果集。
            //SDIFF key [key ...]返回一个集合的全部成员,该集合是所有给定集合的差集 。
            //SDIFFSTORE destination key [key ...]此命令等同于SDIFF,但它将结果保存到destination集合,而不是简单地返回结果集。
            
             */        
            
        }    
        
        /**
         * @param args
         */
        public static void main(String[] args) {
            
            JedisDemo t1 = new JedisDemo();
            t1.test1();
        }
    
    }

    相关操作如下

    http://blog.chinaunix.net/uid-790245-id-3766268.html

  • 相关阅读:
    宿主机无法访问CentOS7上Jenkins服务的解决办法
    415. Add Strings
    367. Valid Perfect Square
    326. Power of Three
    258. Add Digits
    231. Power of Two
    204. Count Primes
    202. Happy Number
    172. Factorial Trailing Zeroes
    171. Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/vigarbuaa/p/3700712.html
Copyright © 2011-2022 走看看