redis介绍和安装(一)

Redis介绍
redis是一个key-value存储系统。

和Memcached类似,它支持存储的value类型相对更多,包括

string(字符串)、
list(链表)、set(集合)、zset(sorted set
–有序集合)和hash(哈希类型)。

数据都是缓存在内存中。

可以在一些官网和网站上了解下。

redis.io     www.redis.cn
www.redis.io/documentation
redis作者谈redis应用场景
http://blog.nosqlfan.com/html/2235.html
redis bitmap进行活跃用户统计
http://blog.nosqlfan.com/html/3501.html
nosqlfan.com

redis和memcached区别:

区别的是redis会周期性的 把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

redi和mysql的一些区别:

redis和mysql要根据具体业务场景去选型

mysql:数据放在磁盘   redis:数据放在内存
redis适合放一些频繁使用,比较热的数据,因为是放在内存中,读写速度都非常快 首先要知道mysql存储在磁盘里,redis存储在内存里,redis既可以用来做持久存储,也可以做缓存,而目前大多数公司的存储都是mysql + redis,其中:
mysql作为主存储,redis作为辅助存储被用作缓存,加快访问读取的速度,提高性能。 那么为什么不直接全部用redis存储呢?
因为redis存储在内存中,如果存储在内存中,存储容量肯定要比磁盘少很多,那么要存储大量数据,只能花更多的钱去购买内存,造成在一些不需要高性能的地方是相对比较浪费的,所以目前基本都是mysql(主) + redis(辅),在需要性能的地方使用redis,在不需要高性能的地方使用mysql,好钢用在刀刃上
)mysql支持sql查询,可以实现一些关联的查询以及统计;
)redis对内存要求比较高,在有限的条件下不能把所有数据都放在redis;
)mysql偏向于存数据,redis偏向于快速取数据,但redis查询复杂的表关系时不如mysql,所以可以把热门的数据放redis,mysql存基本数据
 

redis 应用场景

 内存服务
2作为mamcache的替代品
3数据一致性有一定要求
4当要支持更多数据类型,使用redis更合适
5需要提供主从

redis和memcached相比独特之处

 redis可以用来存储,memcached用来做缓存
mecached存储的数据是字符串,redis:字符串,链表,哈希结构,集合,有序集合

redis持久化缓存服务
周期性把更新的数据写入到磁盘,把修改的操作记录追加到文件记录下来
redis缺陷

内存低于物理内存3/
两种方式实现数据持久化:
,使用快照方式,将内存中的数据不断写入磁盘
,使用类似mysql的binlog日志(aof)方式,记录每次更新的日志。 建议:
更新频繁,一致性要求比较高,AOF 策略为主
更新不频繁,可以容忍少量数据丢失或者错误,snapshot策略为主。

redis优化经验总结:

  根据业务需要选择合适的数据类型,并为不同的应用场景设置相应的紧凑存储参数
当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能以及最大内存的使用量
如果需要持久化,根据是否可以容忍重启丢失部分数据在快照方式和语句追加方式之间选择其一,不要使用虚拟内存以及
diskstore方式,每秒,实时写入AOF。
不要让你的redis所在机器物理内存使用超过实际内存的3/
redis.conf 中的maxmemory选项,该选项是告诉redis当使用了多少物理内存后开始拒绝后续的写入要求,该参数能很好
保护好你的redis不会因为使用了过多的物理内存而导致swap,最终严重影响性能甚至崩溃。redis.conf文件中vm-enabled
为no
大数据尽量按业务使用多个redis实例把数据分散开。
通过rdb,aof文件进行备份。

下面记录下redis服务安装过程

安装依赖软件
# yum install gcc-c++ tcl redis下载安装,稳定版本,下载解压
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
tar xf redis-4.0..tar.gz
cd redis-4.0.
less README.md
yum -y install tree telnet 编译安装
make (如果是32位make 32bit) 
make PREFIX=/usr/local/redis install (定义安装路径) tcl要大于8.
cd /usr/local/src/bin/
ls
redis-benchmark redis性能测试工具,测试redis在你的系统和配置下读写性能
redis-check-aof 检查aof日志的工具,类似检查mysql binlog工具
redis-check-dump 检查rbd日志工具,本地数据库rdb文件检查。
redis-cli 连接用的客户端,命令行操作工具。
redis-server redis服务进程 配置环境变量
echo 'PATH=/usr/local/redis/bin/:$PATH' >>/etc/profile
tail - /etc/profile
which redis-server
redis-server -h mkdir /usr/local/redis/conf (一般都新建conf,也可以不建,这样标准些)
cp /usr/local/src/redis-2.6./redis.conf /usr/local/redis/conf/ redis-server /usr/local/redis/conf/redis.conf & (后台启动)
lsof -i :6379
安装后发现出现一行WARNING    
添加命令: sysctl vm.overcommit_memory=1(防止内存不够,丢失数据)
vm.overcommit_memory=1
vi /etc/sysctl.conf
vm.overcommit_memory = 1
sysctl -p vm.overcommit_memory参数说明
根据内核文档,该参数有三个值,分别是:
0:当用户空间请求更多的内存时,内存尝试估算出剩余可用的内存
1:当设置参数为1,内核允许超量使用内存直至用完为止,主要用于科学技算
2:内核会使用一个决不过量使用内存的算法,即系统整个内存空间不能超过
    swap+50%的RAM值,50%的参数设定在overcommit_ratio中设定 redis关闭
redis-lis shutdown save redis-cli
127.0.0.1:6379>
让redis以后台进程形式运行
vi redis.conf
daemonize yes            
./bin/redis-server ./redis.conf                
和mysql有些一样,在命令行显示
redis-cli -h 192.168.133.4 -p 6379 set site ww.baidu.com
redis-cli -h 192.168.133.4 -p 6379 get site

用telnet登录
telnet 192.168.133.4 6379
>help set
>help @string
>help 后面可以加上Tab键,

***************************************************************
***************************************************************
redis安装:为客户端设置外部连接密码

设定密码
requirepass test001(这个为密码)
redis-server /usr/local/redis/conf/redis.conf &

登录
redis-cli
set k1 v1
(error)NOAUTH Authentication required
>auth test001

>set k1 v1
>get k1

登录方法二
redis-cli -a passwd
每次登录的时候都要添加密码,这是采取的安全措施。

设置命令别名,禁用危险的命令。
在配置文件中,SECURITY中查找。
在配置文件中
grep '^rename' /usr/local/redis/conf/redis.conf
rename-command get oldboy
将get的命令设置为oldboy,重启服务,使用get不能识别,
使用oldboy能够识别。

在生产环境中一般的配置会添加端口号,密码。
*******************************************************
********************************************************
关于redis报错的问题

第一个警告:

The TCP backlog setting of  cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128
意思是:TCP  backlog设置值,511没有成功,因为 /proc/sys/net/core/somaxconn这个设置的是更小的128

临时解决方法:(即下次启动还需要修改此值)
echo 511 > /proc/sys/net/core/somaxconn
永久解决方法:(即以后启动还需要修改此值)
将其写入/etc/rc.local文件中。
baklog参数实际控制的是已经3次握手成功的还在accept queue的大小。

第二个警告:

overcommit_memory is set to ! 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.
overcommit_memory参数设置为0!在内存不足的情况下,后台程序save可能失败。建议在文件 /etc/sysctl.conf 中将overcommit_memory修改为1

临时解决方法:echo "vm.overcommit_memory=1" > /etc/sysctl.conf
永久解决方法:将其写入/etc/sysctl.conf文件中。

第三个警告

you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix thisissue 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 thesetting after a reboot. Redis must be restarted after THP is disabled.
你使用的是透明大页,可能导致redis延迟和内存使用问题。执行 echo never > /sys/kernel/mm/transparent_hugepage/enabled 修复该问题.

临时解决方法:
echo never > /sys/kernel/mm/transparent_hugepage/enabled。
永久解决方法:
将其写入/etc/rc.local文件中。

安装make的时候报错

如果编译安装过程中,出现报错:

zmalloc.h::: error: jemalloc/jemalloc.h: No such file or directory

原因:一些编译依赖或原来编译遗留出现的问题
解决方案:make distclean。清理一下,然后再make。
**********************************************            
通用操作

查询有哪些key
*:通配任意字符
?:通配单个字符
[]:通配括号内的某一个字符

set site www.zixue.it
set age
keys *
keys site
keys s*
keys site*
keys sit[ey] 随机出现key
randomkey type site
返回key存储的值的类型 key值是否存在
exists age
exists site
存在返回1,不存在返回0 删除key
key *
del age
exists age 改名
rename site syp
exists site set site www.zixue.it
set search www.so.com
rename site search
改名到新名,如果重名,则覆盖。使用renamenx
renamenx site search
如果search 存在,则不改,如果不存在,则改正
返回值为0,则没改成功,返回为1,则更改成功 在配置文件中默认有16(-)个数据库,默认是写在0数据库上
move sea
keys *
select
keys * 设定有效期
ttl search 查询生命周期
对于不存在的key或者已过期的key,都返回-
redis2.8中,对于不存在的key返回值- expire search
pexpire key :毫秒数,设置生命周期
pttl key:以毫秒返回生命周期 set site www.zixue.it
expore site
ttl site
persist site
get site

redis 数据结构操作:

字符串类型
set key value [ex 秒数]|[px 毫秒数] [nx]/[xx] flushdb 清空
keys * set search www.baidu.com ex
10秒有效
ttl search
ex和px同时写,以后面的有效期为准。
set search www.baidu.com ex px ,实际有效期是1205
nx:表示key不存在时,执行操作
xx:表示key存在时,执行操作 flushdb
set site www.so.com
set site www.baidu.com nx
get site
set site www.google.com xx
get site
set abc www.google.com xx mset 一次性设置多个键值
mget 获得 setrange key offset value
把字符串的offset偏移字节,改成value
如果偏移量>字符长度,该字符自动补0x00
set world hello
get world
setrange world ??
get word setrange world ??
get world append key value:把value追加到key的原值上 getrange key start stop
获取字符串中[start,stop]范围的值
对于字符串的下标,左数从0开始,右数从-1开始
set title 'chinese'
getrange title
getrange title - start>=length,返回空字符串
stop>=length,则截取至字符结尾
如果start所处的位置在stop右边,返回空字符串 set status sleep
getset status wakeup
get status
getset status working 适合场景,
秒杀,比如说抢小米手机,问还有多少手机,每个人都在抢。
不用读取mysql数据库,只需要读取redis,进行预订,预订好了,下单给mysql数据库
set age
incr age
decr age
incrby age
decrby age
incrbyfloat age 0.5 setbit key offset value 设置offset对应的二进制位上的值 set char A
set char
set char
offset最大2^-,最大字符串512 bitop operation destkey key1 key2
对key1,key2,keyN作operation,并将结果保存到destkey上
operation可以是and,or,not,xor
setbit lower
setbit lower
get lower
set char Q
get char
bitop or char char lower
get char 对于not操作,key不能多个

综上所述:

redis安装脚本和其配置文件
#!/bin/bash
### 需要gcc gcc-c++ 配置文件 启动脚本查看最下面###
yum install gcc-c++ tcl
#下载最新redis版本
cd /usr/local/src/
wget http://download.redis.io/releases/redis-3.2.6.tar.gz
tar zxvf redis-3.2..tar.gz cd redis-3.2.
make
make install
mkdir /etc/redis
mkdir /var/log/redis -p
mkdir /opt/redis -p ## 拷贝默认配置文件,并根据指定端口进行修改
## 以端口6380举例
#注意端口号(这里不使用默认端口)
cp redis.conf /etc/redis/.conf
#修改为守护进程
sed -i 's/daemonize no/daemonize yes/g' /etc/redis/.conf
#修改默认端口
sed -i 's/port 6370/port 6380/g' /etc/redis/.conf
#指定log路径
sed -i 's#logfile ""#logfile "/var/log/redis/redis_6380.log"#g' /etc/redis/.conf
#修改本地数据库名称,可能要开多个redis
sed -i 's/dbfilename dump.rdb/dbfilename dump_6380.rdb/g' /etc/redis/.conf
#修改本地数据库存放路径
sed -i 's#dir ./#dir /opt/redis#g' /etc/redis/.conf
#添加redis密码
sed -i 's/# requirepass foobared/requirepass 设定的密码/g' /etc/redis/.conf
#开启持久化
sed -i 's/appendonly no/appendonly yes/g' /etc/redis/.conf
#修改日志名称
sed -i 's/appendfilename "appendonly.aof"/appendfilename "appendonly_6380.aof"/g' /etc/redis/.conf
#修改pid文件名称
sed -i 's#pidfile /var/run/redis_6370.pid#pidfile /var/run/redis_6380.pid#g' /etc/redis/.conf ## 命名规则为"redis端口号",例如"redis6380"
cat >> /etc/init.d/redis6380 << EOF
#!/bin/sh
#chkconfig:
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem. REDISPORT=
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"
AUTH_PASSWORD="你的密码" case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT -a $AUTH_PASSWORD shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep
done
echo "Redis stopped"
fi
;;
*)
echo "Please use start or stop as first argument"
;;
esac
EOF # 配置redis配置
cat >> /etc/redis/.conf << EOF
bind 127.0.0.1
protected-mode yes
port
tcp-backlog
timeout
tcp-keepalive
daemonize yes
supervised no
pidfile /var/run/redis_6380.pid
loglevel notice
logfile "/var/log/redis/redis_6380.log"
databases
save
save
save
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump_6380.rdb
dir /opt/redis
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay
repl-disable-tcp-nodelay no
slave-priority
requirepass 设定的密码
appendonly yes
appendfilename "appendonly_6380.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit
slowlog-log-slower-than
slowlog-max-len
latency-monitor-threshold
notify-keyspace-events ""
hash-max-ziplist-entries
hash-max-ziplist-value
list-max-ziplist-size -
list-compress-depth
set-max-intset-entries
zset-max-ziplist-entries
zset-max-ziplist-value
hll-sparse-max-bytes
activerehashing yes
client-output-buffer-limit normal
client-output-buffer-limit slave 256mb 64mb
client-output-buffer-limit pubsub 32mb 8mb
hz
aof-rewrite-incremental-fsync yes
EOF #启动脚本需要添加密码,chkconfig,可以参考最下方
cp utils/redis_init_script /etc/init.d/redis6389
/etc/init.d/redis6380 start      
上一篇:java如何在eclipse编译时自动生成代码


下一篇:Fragment中TabLayout加FragmentViewPager