how-to-install-redis-on-centos6.6-x86_64

how-to-install-redis-on-centos6.6-x86_64

很早以前听过 redis,但没有怎么用过,最近工作涉及,进行简单的测试,记录如下:

参考

超强、超详细Redis数据库入门教程
包含对官网文档的一些翻译,翻译的不错

get redis

官网下载redis

稳定版本 redis-2.8.19

prepare test vm

--privileged //需要修改内核参数
#docker run -i -t -d -P -h redis1 --name redis1 --volume=/Users/Users_datadir_docker:/docker_vol01 centos:6.6 /bin/bash
docker run -i -t -d -P --privileged -h redis1 --name redis1 --volume=/Users/Users_datadir_docker:/docker_vol01 centos:6.6 /bin/bash

dockerIn.sh redis1

cd /docker_vol01/script_docker/datadir_yum/
sh update-yum-repo.sh

install redis

软件位置:/docker_vol01/soft/db/redis/redis-2.8.19.tar.gz

cd /docker_vol01/soft/db/redis/
tar zxf redis-2.8.19.tar.gz

cd redis-2.8.19
yum install -y gcc.x86_64
make    //依赖 gcc
  • 问题1:make报错

    原因:参考

    处理方法1:

    cd deps
    make hiredis lua jemalloc linenoise
    cd ../
    make

    [root@redis1 redis-2.8.19]# make hiredis lua jemalloc linenoise

    [root@redis1 deps]# cd ..
    [root@redis1 redis-2.8.19]# find . -type f -name jemalloc.h
    ./deps/jemalloc/include/jemalloc/jemalloc.h
    [root@redis1 redis-2.8.19]# make

    make install

    软件目录结构如下:

    [root@redis1 local]# pwd
    /usr/local
    [root@redis1 local]# ls *
    bin:
    dump.rdb redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server

    etc:

    games:

    include:

    lib:

    lib64:

    libexec:

    sbin:

    share:
    applications info man

    src:
    [root@redis1 local]#

configure redis

bin/redis-server 

默认配置启动 redis 时,有告警提示

[3119] 31 Mar 09:41:31.746 # Server started, Redis version 2.8.19
[3119] 31 Mar 09:41:31.746 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1’ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1’ for this to take effect.
[3119] 31 Mar 09:41:31.746 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command ‘echo never > /sys/kernel/mm/transparent_hugepage/enabled’ as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
[3119] 31 Mar 09:41:31.746 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

  • 配置内核

    cp /etc/sysctl.conf /etc/sysctl.conf.org  
    vi /etc/sysctl.conf
    添加:
    vm.overcommit_memory = 1  
    sysctl -p 
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    \#vi /etc/rc.local  //docker测试环境测试无效,启动container并不执行 /etc/rc.local
    \#echo never > /sys/kernel/mm/transparent_hugepage/enabled
  • 问题2:docker环境在/etc/sysctl.conf中配置部分内核参数无效

    echo 128 > /proc/sys/net/core/somaxconn
    net.core.somaxconn
  • 配置redis配置文件

    mkdir -p /etc/redis/
    cp /docker_vol01/soft/db/redis/redis-2.8.19/redis.conf /etc/redis/6379.conf
    vi /etc/redis/6379.conf
    暂默认,略

test redis

启动 reids-server 示例

bin/redis-server /etc/redis/6379.conf

连接 redis-server

bin/redis-cli -h localhost -p 6379 -n 0

test string

测试 string

设置key值,获取key值

set key1 1  =>set key "1"
get key1

localhost:6379> set key1 1
OK
localhost:6379> get key1
“1”
localhost:6379>

自增

incr key2
incr key2
incr key2
incrby key2 5
get key2
get key3

localhost:6379> incr key2
(integer) 1
localhost:6379> incr key2
(integer) 2
localhost:6379> incr key2
(integer) 3
localhost:6379> incrby key2 5
(integer) 8
localhost:6379> get key2
“8”
localhost:6379> get key3
(nil)
localhost:6379>

test list

测试list, 类似java的 LinkedList

添加list元素

lpush list1 1
rpush list1 2
lpush list1 0

localhost:6379> lpush list1 1
(integer) 1
localhost:6379> get list1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
localhost:6379> lget list1
(error) ERR unknown command ‘lget’
localhost:6379> rpush list1 2
(integer) 2
localhost:6379>
localhost:6379> lpush list1 0
(integer) 3
localhost:6379>

获取list取值

lrange list1  //错误命令
lrange list1 0 //错误命令
lrange list1 0 -1
lrange list1 0 1

localhost:6379> lrange list1
(error) ERR wrong number of arguments for ‘lrange’ command
localhost:6379> lrange list1 0
(error) ERR wrong number of arguments for ‘lrange’ command
localhost:6379> lrange list1 0 -1
1) “0”
2) “1”
3) “2”
localhost:6379>
localhost:6379> lrange list1 0 1
1) “0”
2) “1”
localhost:6379>

test set

测试 set

添加 set元素,获取set元素

sadd set1 1
sadd set1 2
sadd set1 1
smembers set1 
smembers set2

localhost:6379> sadd set1 1
(integer) 1
localhost:6379>
localhost:6379> sadd set1 2
(integer) 1
localhost:6379> sadd set1 1
(integer) 0
localhost:6379>
localhost:6379> smembers set1
1) “1”
2) “2”
localhost:6379> smembers set2
(empty list or set)
localhost:6379>

sismember set1 2
sismember set1 10

localhost:6379> sismember set1 2
(integer) 1
localhost:6379> sismember set1 10
(integer) 0
localhost:6379>

测试set运算

sadd set2 1
sadd set2 3
sunion set1 set2
sdiff set1 set2
sdiff set2 set1

localhost:6379> smembers set2
1) “1”
2) “3”
localhost:6379> smembers set1
1) “1”
2) “2”
localhost:6379>
localhost:6379> sunion set1 set2
1) “1”
2) “2”
3) “3”
localhost:6379> sdiff set1 set2
1) “2”
localhost:6379>
localhost:6379> sdiff set2 set1
1) “3”
localhost:6379>

test sorted set

测试有序set

zadd zset1 1 google.com
zadd zset1 2 baidu.com
zadd zset1 3 alibaba.com
zadd zset1 4 tecent.com
zadd zset1 10 jd.com

查看有序 sort的元素

zrange zset1 0 -1
zrange set1 0 -1 withscores

localhost:6379> zrange zset1 0 -1
1) “google.com”
2) “baidu.com”
3) “alibaba.com”
4) “tecent.com”
5) “jd.com”
localhost:6379>

localhost:6379> zrange zset1 0 -1 withscores
1) “google.com”
2) “1”
3) “baidu.com”
4) “2”
5) “alibaba.com”
6) “3”
7) “tecent.com”
8) “4”
9) “jd.com”
10) “10”
localhost:6379>

test hash

测试hash,类似java中的 Map

hmset user:1 name antirez password Antirez age 34
hgetall user:1
hget user:1 name
hget user:1 name2
hgetall user:2

localhost:6379> hmset user:1 name antirez password Antirez age 34
OK
localhost:6379> hgetall user:1
1) “name”
2) “antirez”
3) “password”
4) “Antirez”
5) “age”
6) “34”
localhost:6379> hget user:1 name
“antirez”
localhost:6379> hget user:1 name2
(nil)
localhost:6379> hgetall user:2
(empty list or set)
localhost:6379>

test select and see db

测试redis选择不同的db

查看当前db已存在的key

keys *
keys set*

选择指定db

select 2

localhost:6379> keys *
1) “key1”
2) “set2”
3) “zset1”
4) “key2”
5) “set1”
6) “user:1”
7) “list1”
localhost:6379> keys set*
1) “set2”
2) “set1”
localhost:6379> select 2
OK
localhost:6379[2]> keys *
(empty list or set)
localhost:6379[2]>

test flushall

测试 flushall,会清空redis数据

select 0
flushall

localhost:6379[1]> select 0
OK
localhost:6379> keys *
1) “key1”
2) “set2”
3) “zset1”
4) “key2”
5) “set1”
6) “user:1”
7) “list1”
localhost:6379> flushall
OK
localhost:6379> keys *
(empty list or set)
localhost:6379>

test transaction support

测试redis事务支持

1

multi
incr flag1
incr flag1
incr flag1
incr flag2
incr flag2
exec

2

multi
incr flag1
hha //事务中不能忽略的报错
incr flag2
exec

localhost:6379> multi
OK
localhost:6379> incr flag1
QUEUED
localhost:6379> hha
(error) ERR unknown command ‘hha’
localhost:6379> incr flag2
QUEUED
localhost:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
localhost:6379>

3

multi
set name "a"
sadd name "b"  //事务中会忽略的错误,操作失败了,但执行成功,感觉违背了事务的整体性
set name "c"
exec

localhost:6379> multi
OK
localhost:6379> set name “a”
QUEUED
localhost:6379> sadd name “b”
QUEUED
localhost:6379> set name “c”
QUEUED
localhost:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
localhost:6379> get name
“c”
localhost:6379>

4 测试 watch

“WATCH”,这是一个很好用的指令,它可以帮我们实现类似于“乐观锁”的效果,即CAS(check and set)。
WATCH本身的作用是“监视key是否被改动过”,而且支持同时监视多个key,只要还没真正触发事务,WATCH都会尽职尽责的监视,一旦发现某个key被修改了,在执行EXEC时就会返回nil,表示事务无法触发。

session1: 每次开始事务(multi)前都需要执行 watch,才有效

set k1 1000
watch k1
multi
set k1 1100
...
exec

session2 在session1执行过程中修改 k1 的值

set k1 2000

localhost:6379> set k1 1000
OK
localhost:6379> get k1
“1000”
localhost:6379> watch k1
OK
localhost:6379> multi
OK
localhost:6379> set k1 1100
QUEUED
localhost:6379> get k1
QUEUED
localhost:6379> exec
(nil)
localhost:6379> get k1
“2000”
localhost:6379>

java 访问 redis

参考:Java中使用Jedis操作Redis

  • 创建使用 redis的工具类
package util

import redis.clients.jedis.{Jedis, JedisPoolConfig, JedisPool}

object RedisUtils {

    val host = "redis1"
    val port = 6379

    val MAX_ACTIVE=100
    val MAX_IDLE=10
    val MAX_WAIT=10000
    val TIMEOUT=10000

    val TEST_ON_BORROW=true
    var jedisPool:JedisPool=null

    val jedisPoolConf=new JedisPoolConfig

    def init_redis(): Unit ={
        jedisPoolConf.setMaxTotal(MAX_ACTIVE)
        jedisPoolConf.setMaxIdle(MAX_IDLE)
        jedisPoolConf.setMaxWaitMillis(MAX_WAIT)
        jedisPoolConf.setTestOnBorrow(TEST_ON_BORROW)
        jedisPool=new JedisPool(jedisPoolConf, host, port, TIMEOUT)
    }

    def getJedis(): Jedis ={
        try {
            if (jedisPool == null) {
                init_redis()
            }
            jedisPool.getResource
        } catch {
            case ex: Exception => {
                ex.printStackTrace()
                return null
            }
        }
    }

    def releaseJedis(jedis:Jedis): Unit ={
        if(jedis!=null){
            jedisPool.returnResourceObject(jedis)
        }
    }
}
  • 单元测试
package util

import org.scalatest.{BeforeAndAfter, FunSuite}
import redis.clients.jedis.Jedis

/**
 * Created by tsingfu on 15/4/8.
 */
class RedisUtilsSuite extends FunSuite with BeforeAndAfter {

    val jedis1 = new Jedis("172.17.0.8", 6379)

    before{
        jedis1.flushDB()
    }
    after{
        jedis1.flushDB()
    }

    test("1 test string"){

        jedis1.set("key1","value1")
        jedis1.set("key2","value2")
        assert(jedis1.get("key1")=="value1")

        jedis1.set("key1","value12")
        assert(jedis1.get("key1")=="value12")

        assert(jedis1.exists("key2"))
        jedis1.del("key2")
        assert(!jedis1.exists("key2"))

    }

    test("2 test list"){

        jedis1.lpush("list1","b")
        jedis1.rpush("list1","c")
        jedis1.lpush("list1","a")
        assert(jedis1.lrange("list1", 0, -1).toArray.mkString("-")=="a-b-c")

        assert(jedis1.lpop("list1")=="a")
        assert(jedis1.rpop("list1")=="c")

    }

    test("3 test set"){

        jedis1.sadd("set1","b","c")
        assert(jedis1.smembers("set1").toArray.mkString("-")=="b-c")
        jedis1.srem("set1","b")
        assert(jedis1.smembers("set1").toArray.mkString("-")=="c")

    }

    test("4 test sorted set"){

        jedis1.zadd("zset1",1,"google")
        jedis1.zadd("zset1",2,"baidu")
        jedis1.zadd("zset1",3,"alibaba")
        jedis1.zadd("zset1",4,"tencent")
        jedis1.zadd("zset1",10,"jd")

        assert(jedis1.zrange("zset1", 0, -1).toArray===Array("google","baidu","alibaba","tencent","jd"))
    }

    test("5 test hash"){

        jedis1.hset("hash1","feild1","value1")
        jedis1.hset("hash1","feild2","value2")
        assert(jedis1.hlen("hash1")===2)
    }


    test("6 test jedis with JedisPool"){
        val jedis2=RedisUtils.getJedis

        // string
        jedis2.set("key1","value1")
        assert(jedis2.get("key1")=="value1")

        jedis2.append("key1","2")
        assert(jedis2.get("key1")=="value12")

        jedis2.incr("key2")
        assert(jedis2.get("key2")=="1")

        jedis2.mset("key2","2", "key3","value3")
        assert(jedis1.mget("key1","key3").toArray===Array("value12","value3"))


        // list
        jedis2.lpush("list1","b")
        jedis2.lpush("list1","a")
        jedis2.rpush("list1","c")

        assert(jedis2.lrange("list1",0,1).toArray===Array("a","b"))
        assert(jedis2.lrange("list1",0,-1).toArray===Array("a","b","c"))


        assert(jedis2.lpop("list1")==="a")
        assert(jedis2.rpop("list1")==="c")


        // set
        jedis2.sadd("set1","a","b")
        assert(jedis2.smembers("set1").toArray.toSet===Set("a","b"))
        assert(jedis2.sismember("set1","b"))
        assert(!jedis2.sismember("set1","c"))


        // sort set

        // hash

        RedisUtils.releaseJedis(jedis2)
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值