how-to-install-redis-on-centos6.6-x86_64
很早以前听过 redis,但没有怎么用过,最近工作涉及,进行简单的测试,记录如下:
超强、超详细Redis数据库入门教程
包含对官网文档的一些翻译,翻译的不错
官网下载redis
稳定版本 redis-2.8.19
--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
软件位置:/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-serveretc:
games:
include:
lib:
lib64:
libexec:
sbin:
share:
applications info mansrc:
[root@redis1 local]#
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
暂默认,略
启动 reids-server
示例
bin/redis-server /etc/redis/6379.conf
连接 redis-server
bin/redis-cli -h localhost -p 6379 -n 0
测试 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>
测试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>
测试 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>
测试有序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>
测试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>
测试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]>
测试 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>
测试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中使用Jedis操作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)
}
}