Mac安装
推荐使用 Homenbrew 安装,执行 brew 命令即可。
brew install redis
启动 Redis 服务:
brew services start redis
redis-server /usr/local/etc/redis.conf
这样就启动了 Redis 服务。
同样可以使用 redis-cli 进入 Redis 命令行模式。
Mac 下 Redis 的配置文件路径是 /usr/local/etc/redis.conf,可以通过修改它来配置访问密码。
修改配置文件后需要重启 Redis 服务,停止、重启 Redis 服务的命令如下:
brew services stop redis
brew services restart redis
另外在 Mac 下也可以安装 Redis Desktop Manager 可视化管理工具来管理 Redis。
redis客户端启动
redis-cli
Ubuntu安装
Ubuntu 下安装
在 Ubuntu 系统安装 Redis 可以使用以下命令:
$sudo apt-get update
$sudo apt-get install redis-server
启动 Redis
$ redis-server
查看 redis 是否启动?
$ redis-cli
以上命令将打开以下终端:
redis 127.0.0.1:6379>
127.0.0.1 是本机 IP ,6379 是 redis 服务端口。现在我们输入 PING 命令。
redis 127.0.0.1:6379> ping
PONG
以上说明我们已经成功安装了redis
启动服务
redis-server
按ctrl+c停止
客户端启动
redis-cli
查看总体数据库命令
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"mikejing"
127.0.0.1:6379> INFO keyspace
# Keyspace
db0:keys=1,expires=0,avg_ttl=0
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> set name 111
OK
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> INFO keyspace
# Keyspace
db0:keys=1,expires=0,avg_ttl=0
db1:keys=1,expires=0,avg_ttl=0
127.0.0.1:6379> *1
(error) ERR unknown command `*1`, with args beginning with:
127.0.0.1:6379> CONFIG GET databases
1) "databases"
2) "16"
127.0.0.1:6379> select 16
(error) ERR DB index is out of range
127.0.0.1:6379> select 15
OK
1.select 选择数据库
2.INFO keyspace 查看所有数据库
3.CONFIG GET databases 默认配置16个 index到15,查看数量
然后根据下面介绍操作即可,默认选择0
基本配置
/var/lib/redis 数据文件存储路径
/usr/bin/redis-cli /usr/bin/redis-service 源文件路径
/etc/redis/redis.conf 为配置文件
绑定地址:如果需要远程访问,可将此行注释
bind 127.0.0.1
端口,默认为6379
port 6379
是否以守护进程运行
如果以守护进程运行,则不会在命令行阻塞,类似于服务 如果以非守护进程运行,则当前终端被阻塞,无法使用
推荐改为yes,以守护进程运行
daemonize no|yes
数据文件存储路径
dir的默认值为./,表示当前目录
推荐改为:dir /var/lib/redis
- 使用配置文件方式启动
- 直接运行redis-server会直接运行,阻塞当前终端
一般配置文件都放在/etc/目录下
sudo cp /usr/local/redis/redis.conf /etc/redis/
推荐指定配置文件启动
sudo redis-server /etc/redis/redis.conf
停止redis服务
ps ajx|grep redis
sudo kill -9 redis的进程id
数据操作
string
string是redis最基本的类型
最大能存储512MB数据
string类型是二进制安全的,即可以为任何数据,比如数字、图片、序列化对象等
设置键值
set key value
设置键值及过期时间,以秒为单位
SETEX key seconds value
设置多个键值
MSET key value [key value ...]
获取
根据键获取值,如果不存在此键则返回nil
GET key
根据多个键获取多个值
MGET key [key ...]
运算
要求:值是数字
将key对应的value加1
INCR key
将key对应的value加整数
INCRBY key increment
将key对应的value减1
DECR key
将key对应的value减整数
DECRBY key decrement
其它
追加值
APPEND key value
获取值长度
STRLEN key
##键的命令
查找键,参数支持正则
KEYS pattern
判断键是否存在,如果存在返回1,不存在返回0
EXISTS key [key ...]
查看键对应的value的类型
TYPE key
删除键及对应的值
DEL key [key ...]
设置过期时间,以秒为单位
创建时没有设置过期时间则一直存在,直到使用使用DEL移除
EXPIRE key seconds
查看有效时间,以秒为单位
TTL key
hash
hash用于存储对象,对象的格式为键值对
设置单个属性
HSET key field value
设置多个属性
HMSET key field value [field value ...]
获取一个属性的值
HGET key field
获取多个属性的值
HMGET key field [field ...]
获取所有属性和值
HGETALL key
获取所有的属性
HKEYS key
返回包含属性的个数
HLEN key
获取所有值
HVALS key
其它
判断属性是否存在
HEXISTS key field
删除属性及值
HDEL key field [field ...]
返回值的字符串长度
HSTRLEN key field
list
列表的元素类型为string
按照插入顺序排序
在列表的头部或者尾部添加元素
在头部插入数据
LPUSH key value [value ...]
在尾部插入数据
RPUSH key value [value ...]
在一个元素的前|后插入新元素
LINSERT key BEFORE|AFTER pivot value
设置指定索引的元素值
索引是基于0的下标
索引可以是负数,表示偏移量是从list尾部开始计数,如-1表示列表的最后一个元素
LSET key index value
获取
移除并且返回 key 对应的 list 的第一个元素
LPOP key
移除并返回存于 key 的 list 的最后一个元素
RPOP key
返回存储在 key 的列表里指定范围内的元素
start 和 end 偏移量都是基于0的下标
偏移量也可以是负数,表示偏移量是从list尾部开始计数,如-1表示列表的最后一个元素
LRANGE key start stop
其它
裁剪列表,改为原集合的一个子集
start 和 end 偏移量都是基于0的下标
偏移量也可以是负数,表示偏移量是从list尾部开始计数,如-1表示列表的最后一个元素
LTRIM key start stop
返回存储在 key 里的list的长度
LLEN key
返回列表里索引对应的元素
LINDEX key index
set
无序集合
元素为string类型
元素具有唯一性,不重复
添加元素
SADD key member [member ...]
获取
返回key集合所有的元素
SMEMBERS key
返回集合元素个数
SCARD key
其它
求多个集合的交集
SINTER key [key ...]
求某集合与其它集合的差集
SDIFF key [key ...]
求多个集合的合集
SUNION key [key ...]
判断元素是否在集合中
SISMEMBER key member
zset
sorted set,有序集合
元素为string类型
元素具有唯一性,不重复
每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序
元素的score可以相同
添加
ZADD key score member [score member ...]
获取
返回指定范围内的元素
ZRANGE key start stop
返回元素个数
ZCARD key
返回有序集key中,score值在min和max之间的成员
ZCOUNT key min max
返回有序集key中,成员member的score值
ZSCORE key member
发布订阅
发布者不是计划发送消息给特定的接收者(订阅者),而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅
订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的
发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑
客户端发到频道的消息,将会被推送到所有订阅此频道的客户端
客户端不需要主动去获取消息,只需要订阅频道,这个频道的内容就会被推送过来
消息的格式 推送消息的格式包含三部分 part1:消息类型,包含三种类型 subscribe,表示订阅成功
unsubscribe,表示取消订阅成功 message,表示其它终端发布消息
如果第一部分的值为subscribe,则第二部分是频道,第三部分是现在订阅的频道的数量
如果第一部分的值为unsubscribe,则第二部分是频道,第三部分是现在订阅的频道的数量,如果为0则表示当前没有订阅任何频道,当在Pub/Sub以外状态,客户端可以发出任何redis命令
如果第一部分的值为message,则第二部分是来源频道的名称,第三部分是消息的内容
订阅
SUBSCRIBE 频道名称 [频道名称 ...]
取消订阅
如果不写参数,表示取消所有订阅
UNSUBSCRIBE 频道名称 [频道名称 ...]
发布
PUBLISH 频道 消息
主从配置
一个master可以拥有多个slave,一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构
比如,将ip为192.168.1.10的机器作为主服务器,将ip为192.168.1.11的机器作为从服务器
设置主服务器的配置
Mac开启两个终端,通过ssh连接两台电脑,然后修改这两台电脑的配置文件主服务器
从服务器
这两台电脑分别启动
这里的ip一定要写,因为之前把配置文件给修改了,不在默认是127.0.0.1了
redis-cli -h 自己对应的ip
bind 192.168.13.99
设置从服务器的配置
注意:在slaveof后面写主机ip,再写端口,而且端口必须写
bind 192.168.13.78
slaveof 192.168.13.99 6379
在master和slave分别执行info命令,查看输出信息
在master上写数据
set hello world
在slave上读数据
get hello
也就是两台不同的电脑,redis服务可以通过修改配置文件设置主从的方式进行数据同步
python3.6实现
安装
pip3 install redis
交互代码
引入模块
import redis
连接
try:
r=redis.StrictRedis(host='ip地址',port=6379)
except Exception as result:
print (result)
方式一:根据数据类型的不同,调用相应的方法,完成读写
更多方法同前面学的命令
r.set('name','hello')
r.get('name')
方式二:pipline
缓冲多条命令,然后一次性执行,减少服务器-客户端之间TCP数据库包,从而提高效率
pipe = r.pipeline()
pipe.set('name', 'world')
pipe.get('name')
pipe.execute()
封装
连接redis服务器部分是一致的
这里将string类型的读写进行封装
import redis
class RedisHelper():
def __init__(self,host='localhost',port=6379):
self.__redis = redis.StrictRedis(host, port)
def get(self,key):
if self.__redis.exists(key):
return self.__redis.get(key)
else:
return ""
def set(self,key,value):
self.__redis.set(key,value)
示例:用户登录
业务过程如下:
输入用户名、密码
密码加密
判断redis中是否记录了用户名,如果有则成功
如果redis中没有用户名,则到mysql中查询
从mysql中查询成功后,将用户名记录到redis中
#encoding=utf-8
from t2 import RedisHelper
from t3 import MysqlHelper
import hashlib
name=raw_input("请输入用户名:")
pwd=raw_input("请输入密码:")
sha1=hashlib.sha1()
sha1.update(pwd)
pwd1=sha1.hexdigest()
try:
redis=RedisHelper()
if redis.get('uname')==name:
print 'ok'
else:
mysql=MysqlHelper('localhost',3306,'test1','root','mysql')
upwd=mysql.get_one('select upwd from userinfos where uname=%s',[name])
if upwd==None:
print ('用户名错误')
elif upwd[0]==pwd1:
redis.set('uname', name)
print ('登录成功')
else:
print ("密码错误")
except Exception as result:
print result
这几个图是根据看完redis之后记录下来的,方便理解,没有细分,画个大概,高手可以留言指点下,毕竟只是初步学习了下,方便以后理解