Redis

Memcached与Redis的对比

Memcached:

优点:
1. 纯set get性能好
2. 开发都会用,易用简单
4. 可用于存放session
缺点:
1. 不支持持久化
2. 支持类型单一
3. 没有验证
4. 依靠magent

Redis:

优点:
1. 持久化
2. 支持集群
3. 有基础验证
4. 支持多种数据类型
5. 可用于购物车
缺点:
1. 性能不如memcached

解决方案:1.写两份 2.预刷新(写个脚本,把常用的数据放到redis里卖)

redis官网:https://redis.io/

安装部署redis

系统要求:
linux:CentOS7
memory:2G+
ip address:192.168.1.5
zookeeper:3.4.10
redis:redis-3.2.9
java version:1.8.0_131 下载redis的源码安装包
# cd /usr/local/src && wget -c http://download.redis.io/releases/redis-3.2.9.tar.gz 解压redis的源码安装包
# tar -zxvf redis-3.2.9.tar.gz 切换到redis的源码安装目录
# cd redis-3.2.9/ 安装redis
# make PREFIX=/usr/local/redis-3.2.9 install 最佳实现方式,创建redis的软连接
# ln -sv /usr/local/redis-3.2.9/ /usr/local/redis 复制redis的启动脚本到init.d下作为开机自启动脚本使用
# cp /usr/local/src/redis-3.2.9/utils/redis_init_script /etc/init.d/redis 修改redis的启动脚本
# vim /etc/init.d/redis 修改内容如下,修改EXEC、CLIEXEC的启动路径
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli 添加执行权限
# chmod +x /etc/init.d/redis 创建redis脚本中指定的redis.conf配置文件的路径
# mkdir /etc/redis 复制redis.conf到脚本指定的路径下
# cp /usr/local/src/redis-3.2.9/redis.conf /etc/redis/6379.conf 修改网络最大支持链接数为512(默认为128)
# echo 512 > /proc/sys/net/core/somaxconn 创建redis所需目录
# mkdir -p /var/lib/redis_6379 编辑redis.conf配置文件
# vim /etc/redis/6379.conf 修改配置文件中的配置为以下配置
daemonize yes
logfile "/var/log/redis_6379.log"
dbfilename dump_6379.rdb
dir /var/lib/redis_6379
requirepass demon 注意:
daemonize: 支持后台运行
logfile: 指定redis的log日志存放
requirepass:指定用户密码,避免root用户启动redis提权,密码自己设置 启动redis服务
# /etc/init.d/redis start 看一眼redis的日志,根据警告可以自行调试
# tail /var/log/redis_6379.log 调试redis日志中的警告信息
# sysctl vm.overcommit_memory=1
# echo never > /sys/kernel/mm/transparent_hugepage/enabled 删除redis的pid文件,重启redis
# rm -rf /var/run/redis_6379.pid
# /etc/init.d/redis stop
# /etc/init.d/redis start 启用redis的client测试redis
# /usr/local/redis/bin/redis-cli -a demon 输入info即可查看redis的相关信息
127.0.0.1:6379> info
# Server
redis_version:3.2.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:6fc178b1c807c960
redis_mode:standalone
os:Linux 3.10.0-327.el7.x86_64 x86_64
..............

Redis基础数据类型

redis中文教程
http://doc.redisfans.com/index.html

Redis的基本增删改查

另外一种客户端链接redis验证的方法
# /usr/local/redis/bin/redis-cli

String实现键值段

127.0.0.1:6379> auth demon
OK 设置一个key名称为name,键值为demon的数据
127.0.0.1:6379> set name demon
OK 获取key为name的数据
127.0.0.1:6379> get name
"demon" 获取redis中所有的键名称(生产中不建议使用)
127.0.0.1:6379> keys *
1) "name" 判断redis中的键是否存在(返回1即存在,0为不存在)
127.0.0.1:6379> exists name
(integer) 1 修改name键的数据
127.0.0.1:6379> set name demon_gdy
OK
127.0.0.1:6379> get name
"demon_gdy" 查看数据类型
type name 删除一个已存在的键
127.0.0.1:6379> del name
(integer) 1

Hash实现键值段

类似于python中的字典嵌套字典的方式(hash)

127.0.0.1:6379> hset car name BMW
(integer) 1
127.0.0.1:6379> hset car price 10RMB
(integer) 1 注意:
car是一个键,对应了两个值,分别又是一队键值段,price作为另外一个car中的key,对应了10RMB的值,name同样也是这样,类似于python中的
{'car':{'name':'BMW','price':'10RMB'}} 查看car键中的键
127.0.0.1:6379> hkeys car
1) "name"
2) "price" 查看car键中有几个元素
127.0.0.1:6379> hlen car
(integer) 2 获取数据car键中的数据
127.0.0.1:6379> hget car name
"BMW"
127.0.0.1:6379> hget car price
"10RMB" 删除car中的key为price对应的值
127.0.0.1:6379> hdel car price
(integer) 1 删除car中的所有key,包括car..
del car

List实现键值段

从开头开始添加键值(从左到右)
127.0.0.1:6379> lpush numbers 1
(integer) 1
127.0.0.1:6379> lpush numbers 2
(integer) 2 从后往前添加键值(从右到左)
127.0.0.1:6379> rpush numbers 9
(integer) 3
127.0.0.1:6379> rpush numbers 10
(integer) 4 查看numbers key的长度
127.0.0.1:6379> llen numbers
(integer) 4 查看numbers中指定范围的数据
127.0.0.1:6379> lrange numbers 0 4
1) "2"
2) "1"
3) "9"
4) "10" 查看列表中对应位置的数据(和python中的list一样,元素的索引从0开始)
127.0.0.1:6379> lindex numbers 2
"9 在列表中指定的数据前或后插入数据
127.0.0.1:6379> linsert numbers before 9 8
(integer) 5 127.0.0.1:6379> linsert numbers after 10 11
(integer) 6 注意:
before|after 后面跟的是list中已存在的元素,最后一个是要插入的数据 127.0.0.1:6379> lrange numbers 0 6
1) "2"
2) "1"
3) "8"
4) "9"
5) "10"
6) "11" numbers中从后删除一个数据
127.0.0.1:6379> rpop numbers
"11" numbers中从开头删除一个数据
127.0.0.1:6379> lpop numbers
"2"

Set实现键值段

创建一个country的集合,在里面添加如下值

127.0.0.1:6379> sadd country china

(integer) 1

127.0.0.1:6379> sadd country america

(integer) 1

127.0.0.1:6379> sadd country canada

(integer) 1

创建一个diff_country的集合,在里面添加如下值
127.0.0.1:6379> sadd diff_country china
(integer) 1
127.0.0.1:6379> sadd diff_country japan
(integer) 1
127.0.0.1:6379> sadd diff_country england
(integer) 1
127.0.0.1:6379> sadd diff_country canada
(integer) 1 查看country的类型
127.0.0.1:6379> type country
set 获取集合中的元素
127.0.0.1:6379> SMEMBERS country
1) "america"
2) "canada"
3) "china" 127.0.0.1:6379> SMEMBERS diff_country
1) "japan"
2) "canada"
3) "china"
4) "england" 查看一个元素是否在集合中(返回1为真,0为假)
127.0.0.1:6379> SISMEMBER country china
(integer) 1 127.0.0.1:6379> SISMEMBER country chinaaaa
(integer) 0 集合中做差集(country中有diff_country中没有的元素)
127.0.0.1:6379> sdiff country diff_country
1) "america" 集合中做交集(country与diff_country中共有的元素)
127.0.0.1:6379> SINTER country diff_country
1) "canada"
2) "china" 集合中的并集
127.0.0.1:6379> SUNION country diff_country
1) "canada"
2) "china"
3) "england"
4) "america"
5) "japan"

Redis持久化

Redis 提供了多种不同级别的持久化方式:

  • RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。
  • AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
  • Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。
  • 你甚至可以关闭持久化功能,让数据只在服务器运行时存在。

建议调优参考文档:http://doc.redisfans.com/topic/persistence.html

redis主从复制,配置一个从服务器非常简单, 只要在配置文件中增加以下的这一行就可以了:
slaveof 192.168.1.1 6379

Redis集群实现方式

架构图

解决方案实例
https://github.com/CodisLabs/codis

部署Codis

Codis使用安装文档
https://github.com/CodisLabs/codis/blob/release3.2/doc/tutorial_zh.md 安装Go运行环境
# yum install -y gcc glibc gcc-c++ make git
# cd /usr/local/src 下载golang的源码包
# wget -c https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz 解压golang源码包
# tar -zxvf go1.8.3.linux-amd64.tar.gz 移动解压目录到/usr/local下
# mv go /usr/local/ 创建GOPATH环境
# mkdir /usr/local/go/work
# echo "export GOROOT=/usr/local/go" >> /etc/profile.d/golang.sh
# echo "export GOPATH=/usr/local/go/work" >> /etc/profile.d/golang.sh
# echo "PATH=$PATH:$HOME/bin:$GOROOT/bin:$GOPATH/bin" >> /etc/profile.d/golang.sh 重新加载配置文件
# source /etc/profile.d/etc/profile.d/golang.sh 监测go环境
# go version
go version go1.8.3 linux/amd64 下载go所需要的工具包
# go get -u -d github.com/CodisLabs/codis
# go get github.com/tools/godep 切换到go的目录下
# cd $GOPATH/src/github.com/CodisLabs/codis 编译测试codis的安装环境
# make && make gotest 启动codis-dashboard
# ./admin/codis-dashboard-admin.sh start 查看日志
# tail -100 ./log/codis-dashboard.log.2017-06-18 启动codis-proxy
# ./admin/codis-proxy-admin.sh start 启动codis-server
# ./admin/codis-server-admin.sh start 启动codis-fe
# ./admin/codis-fe-admin.sh start

部署zookeeper

参考文档
https://www.unixhot.com/article/32 下载zookeeper的源码包
# cd /usr/local/src && wget -c http://apache.claz.org/zookeeper/stable/zookeeper-3.4.10.tar.gz 解压zookeeper的源码包
# tar -zxvf zookeeper-3.4.10.tar.gz 移动zookeeper的目录到/usr/local下
# mv zookeeper-3.4.10 /usr/local/ 最佳实现方式软连接
# ln -sv /usr/local/zookeeper-3.4.10/ /usr/local/zookeeper 重命名配置文件
# cd /usr/local/zookeeper/conf/
# cp zoo_sample.cfg zoo.cfg 编辑zookeeper的配置文件
# vim zoo.cfg 修改配置如下,在文件的尾部添加后四行内容
dataDir=/data/zk1
clientPort=2181
server.1=192.168.1.5:3181:4181
server.2=192.168.1.5:3182:4182
server.3=192.168.1.5:3183:4183 复制三份配置文件
# cp zoo.cfg zk1.cfg
# cp zoo.cfg zk2.cfg
# cp zoo.cfg zk3.cfg 修改配置文件中的配置
# sed -i 's/zk1/zk2/g' zk2.cfg
# sed -i 's/2181/2182/g' zk2.cfg
# sed -i 's/zk1/zk3/g' zk3.cfg
# sed -i 's/2181/2183/g' zk3.cfg zookeeper伪集群实现 创建三个目录用来存放zookeeper数据
# mkdir -p /data/{zk1,zk2,zk3} 写入伪数据
# echo "1" >/data/zk1/myid
# echo "2" >/data/zk2/myid
# echo "3" >/data/zk3/myid 启动zookeeper
# /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk1.cfg
# /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk2.cfg
# /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk3.cfg 查看Zookeeper角色
# /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk1.cfg
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/conf/zk1.cfg
Mode: follower # /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk2.cfg
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/conf/zk2.cfg
Mode: leader # /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk3.cfg
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/conf/zk3.cfg
Mode: follower 注意:
如果查看角色中出现报错,尝试更改端口号,修改zk*.cfg的配置文件,然后修改端口在尝试重启服务 连接Zookeeper
# /usr/local/zookeeper/bin/zkCli.sh -server 192.168.1.5:2183

zookeeper的最新稳定版有些变化,还在调试ing..未完待续...

Redis的部署及使用的更多相关文章

  1. Redis笔记(二)Redis的部署和启动

    Linux下Redis的部署和启动 下载安装介质 Redis官网地址:http://www.redis.io/目前最新版本是redis-3.0.3. 可以访问 http://download.redi ...

  2. Redis分布式部署,一致性hash

    一致性哈希 由于hash算法结果一般为unsigned int型,因此对于hash函数的结果应该均匀分布在[0,2^32-1]区间,如果我们把一个圆环用2^32 个点来进行均匀切割,首先按照hash( ...

  3. Window Redis分布式部署方案 java

    Redis分布式部署方案 Window 1.    基本介绍 首先redis官方是没有提供window下的版本, 是window配合发布的.因现阶段项目需求,所以研究部署的是window版本的,其实都 ...

  4. windows下安装Redis并部署成服务

    windows下安装Redis并部署成服务 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 一:下载 下载地址: windows版本: http ...

  5. 第一章· Redis入门部署及持久化介绍

    Redis简介 Redis安装部署 Redis持久化 Redis简介 软件说明: Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品. ...

  6. VMware虚拟机安装CentOS6.4、部署web项目全过程(设置固定IP、安装JDK、Tomcat、Redis、部署项目)

    概述:该篇随笔介绍了在VMware上安装centOS.在centOS上安装JDK.安装Tomcat.安装Redis并部署项目的全过程,虽然参考了很多优秀的文章,但实践.整理.补充都很用心,若要复制粘贴 ...

  7. Redis 主从部署

    Redis 主从部署 http://www.xuchanggang.cn/archives/978.html

  8. Redis单机部署、添加开机自启、配置参数

    1.Redis简介 redis是使用C语言编写的开源的,支持网络,基于内存,可持久性的键值对存储数据库,2013年5月之前,Redis是最流行的键值对存储数据库,Redis采用内存数据集,支持多种数据 ...

  9. Redis的部署使用文档

    Redis的部署使用文档   简述: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符 串).list(链表).set( ...

  10. Redis入门部署及持久化

    软件简介 软件说明 Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品. Redis采用内存(In-Memory)数据集(DataSe ...

随机推荐

  1. PYC#1欢乐赛第三题题解

    这里是比赛地址:http://tieba.baidu.com/p/2859693237,果然参赛神牛汇集. 第三题题目大意如下: 已知n条二次函数曲线Si(x)=aix^2+bix+ci(ai> ...

  2. redis源码笔记(一) —— 从redis的启动到command的分发

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载联系作者并保留声明头部与原文链接https://luzeshu.com/blog/redis1 本博客同步在http://www.cnblog ...

  3. iOS多线程开发之NSOperation - 快上车,没时间解释了!

    一.什么是NSOperation? NSOperation是苹果提供的一套多线程解决方案.实际上NSOperation是基于GCD更高一层的封装,但是比GCD更加的面向对象.代码可读性更高.可控性更强 ...

  4. java循环、数组练习

    System.out.println("请输入学生个数"); int a=sc.nextInt();//定义一个变量说明学生的数量 int max=0; int[] scores= ...

  5. 没写完。。51nod_1630: B君的竞技场(期望 概率)

    题目链接 根据 你可以认为B君的水平是在所有人中的等概率随机 ,设 每场中B君获胜的概率为p~U(0,1),在给定的x,y下至游戏结束B君的获胜场数为f(p) (这是一个关于p的函数), 由此

  6. poj_3122:Pie(二分)

    不算难的一道二分..各种玄学错误..eps小了T,大了WA..最后G++改成C++提交就AC了.. #include<iostream> #include<cstdio> #i ...

  7. Effective Objective-C 2.0 Tips 总结 Chapter 3 & Chapter 4

    Chapter 3 接口与 API 设计 Tips 15 使用前缀避免明明空间冲突 Objective-C 没有命名空间,所以我们在起名时要设法避免命名冲突 避免命名冲突的方法就是使用前缀 应用中的所 ...

  8. 扩展entity framework core 实现默认字符串长度,decimal精度,entity自动注册和配置

    报道越短,事情越严重!文章越短,内容越精悍! 文章以efcore 2.0.0-preview2.测试验证通过.其他版本不保证使用,但是思路不会差太远.源代码 目标: 1.实现entity的自动发现和m ...

  9. Mybitis配置文件中的别名以及mapper中的namespace

    1 基本知识 MyBatis中如果每次配置类名都要写全称也太不友好了,我们可以通过在主配置文件中配置别名,就不再需要指定完整的包名了. 别名的基本用法: <configuration> & ...

  10. ThreadLocal源码分析(转)

    阅读总结: ThreadLocal内部使用静态map存储,每个变量对应一个hashcode,不需要指定key值,后台动态生成,good! 每个变量ThreadLocal内部分配Entry,获取值时,通 ...