redis手册

Redis 基础+应用

  • redis 是什么

  • 安装redis

  • redis 数据类型

  • redis应用有哪些

  • python操作redis

 

redis 是什么

NoSQL 非关系型数据库 数据保存在内存中 速度超快

速度比mysql快

只有key value

八种数据类型 常用的有五种数据类型

key最大支持 512M

0-15 16个库

默认端口号 6379

  • 缓存 因为多个请求要访问mysql 这个时候 mysql 可以将结果存储在 redis中

  • 新浪微博

    • 你关注了谁 谁关注了你 你们的共同好友

    • 你关注的人 关注了谁 系统会给你推荐这些人

    • 时间线

 

安装redis

www.redis.cn  下载  

linux 版:
wget -c http://download.redis.io/releases/redis-5.0.5.tar.gz


tar -zxvf redis-5.0.5.tar.gz

sudo mv redis-5.0.5 /usr/local/redis
cd /usr/local/redis
make install  




windows 版:

拷贝 ..../redis\redis-windows-master\src\msopentech 下面的目录到 c盘指定的目录

windows+r   cmd

切换到redis-server.exe所在的目录
编辑 redis.windows.conf  
修改 maxmemory 将其改为201915200 (单位是字节)保存  

启动:redis-server.exe redis.windows.conf #窗口一直开着 ctrl+c 停止
默认端口号 6379  
可视化工具连接 即可  

后台启动  
将redis-server.exe --service-install redis.windows.conf #将其安装到windows系统服务中  

#在命令行中搜索 service 即可打开服务 能看到redis

 

/usr/local/redis/src

aof rdb 定期从内存中 同步到磁盘中 实现数据的持久化

文件名 说明
redis-server redis服务器启动脚本
redis-cli redis客户端脚本
redis-sentinel 哨兵服务器 redis2.0之后才有的
redis-check-aof aof修复工具
redis-check-rdb rdb修复工具
redis-benchmark redis性能测试工具

 

linux redis启动

/usr/local/redis/src/redis-server #不能关闭窗口  

#后台启动步骤  
cd /usr/local/redis
sudo vim redis.conf  
daemonize yes #将no改为 yes 保存

/usr/local/redis/src/redis-server redis.conf

# redis-cli 不需要切换目录 直接写就可以
mxl@mxl-virtual-machine:~$ redis-cli -h ip地址 -p 端口号
127.0.0.1:6379> ping
PONG   #出现PONG 说明成功
127.0.0.1:6379>


#设置密码
127.0.0.1:6379> config set requirepass '123456'
OK
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>
设置密码 还可以 sudo vim /usr/local/redis/redis.conf
  第507行
  requirepass 你的密码

Redis数据类型

不止五种 常用的 有五种数据类型

  • string 最基本的类型

  • hash 缓存常用

  • list 列表

  • set 无序集合

  • zset 有序集合

 

string

key value 最基本的数据类型 键值对

set key value值 

127.0.0.1:6379> set name kangbazi
OK

get key #根据key 获取指定的value值

del key #删除指定的key value值也会被删除

type key #查看key的类型  
---------------------------------------------------------------------------
127.0.0.1:6379> config set requirepass 123456
OK
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> set name kangbazi
OK
127.0.0.1:6379> get name
"kangbazi"
127.0.0.1:6379> type name
string
---------------------------------------------------------------------------

mset key1 value1 keyn valuen #支持同时设置多个键值对
mget key1 keyn #支持同时取出来


---------------------------------------------------------------------------
127.0.0.1:6379> mset name kangbazi name1 kangbazi1 name2 kangbazi2 name3 kangbazi3
OK
127.0.0.1:6379> mget name name1 name2 name3
1) "kangbazi"
2) "kangbazi1"
3) "kangbazi2"
4) "kangbazi3"
---------------------------------------------------------------------------

incr key #key对应的value 累加1

127.0.0.1:6379> set num 1
OK
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> get num
"2"
127.0.0.1:6379> incrby num 100 #指定key的value 增加指定的值
(integer) 102
127.0.0.1:6379> get num
"102"
127.0.0.1:6379> incrbyfloat num 12.34 #指定key的value 增加指定的float类型的值
"64.34"
127.0.0.1:6379> get num
"64.34"
127.0.0.1:6379> setex name 10 kangbazi  #往redis存的过程中直接设置过期时间
OK





decr key #key对应的value 累减1
127.0.0.1:6379> decr num
(integer) 2
127.0.0.1:6379> get num
"2"
127.0.0.1:6379> decrby num 50 # 指定key的value 递减指定的值  
(integer) 52
127.0.0.1:6379> get num
"52"


strlen key # 查看制定key对应的value值得长度  
127.0.0.1:6379> set name kangbazi
OK
127.0.0.1:6379> strlen name
(integer) 8
127.0.0.1:6379> APPEND name boy #往指定key对应的value值后面增加字符串 返回的是增加后字符串的长度
(integer) 11

ttl key #查看 key 在内存中剩余的时间   -1表示永不过期  

127.0.0.1:6379> expire key 秒数 #指定指定key 在内存中的过期时间 秒为单位
(integer) 1
127.0.0.1:6379> ttl name
(integer) 5

基础操作

redis有16个库  0-15号 

select  1 #切换到1号库 默认0号库
keys * #列出当前库中所有的key
keys n* #查看以n字母开头的key
127.0.0.1:6379> dbsize #查看库的大小
(integer) 4 #里边有4个key
flushdb #清空当前库中所有的key
flushall #清空所有库中的key

 

hash 就是键值对的集合 特别适合存放对象

每个hash 能够存放2的32次方-1个键值对

id name age height

1 dada 18 181cm

开发过程中 给mysql缓存常用的类型就是hash 一张数据表 就是一个hash

127.0.0.1:6379> hset user name shuliu age 18 height 181cm
(integer) 3
127.0.0.1:6379> hset user1 name yinli age 19 height 185cm
(integer) 3
127.0.0.1:6379> hget user name
"shuliu"
127.0.0.1:6379> hget user age
"18"
127.0.0.1:6379> hget user height
"181cm"

hget user name age height #不能实现 可以通过 hmget hmget 必须是 hmset设置进去的  

127.0.0.1:6379> hvals user1  #取出指定key 对应的 属性的值
1) "yinli"
2) "19"
3) "185cm"
127.0.0.1:6379> hkeys user1  ##取出指定key 对应的 属性名称
1) "name"
2) "age"
3) "height"

127.0.0.1:6379> hgetall user1 #取出指定key对应的属性的名称及属性的值
1) "name"
2) "yinli"
3) "age"
4) "19"
5) "height"
6) "185cm"


127.0.0.1:6379> hmset language python num1 java num2 c num3 #同hset 批量设置多个键值
OK
127.0.0.1:6379> hmget language python java c  #hget 不能实现多个获取  
1) "num1"
2) "num2"
3) "num3"

127.0.0.1:6379> hlen language  #查看制定的key 里边有多少个键值对  
(integer) 3



127.0.0.1:6379> hexists language javascript #查看指定的key中是否存在指定的属性 存在返回1 不存在返回0
(integer) 0
127.0.0.1:6379> hexists language java  #存在 返回1
(integer) 1
127.0.0.1:6379> hexists language python
(integer) 1

127.0.0.1:6379> hdel language java  #删除指定key中指定的属性  
(integer) 1
127.0.0.1:6379> hexists language java #被删除了 返回0
(integer) 0

127.0.0.1:6379> hmset username name kangbazi666  #查看指定key中属性 对应的value值得长度
OK
127.0.0.1:6379> hstrlen username name
(integer) 11

 

list 列表

按照顺序从开头或者结尾插入

l left lpush 从左侧也就是开头插入元素 js中的队列方法 unshift shift 先进先出

r right rpush 从右侧 也就是结尾插入元素 js中的栈方法 push pop 先进后出

 

127.0.0.1:6379> lpush sql mysql
(integer) 1
127.0.0.1:6379> lpush sql redis
(integer) 2
127.0.0.1:6379> lpush sql mongodb
(integer) 3
127.0.0.1:6379> rpush sql sqlserver
(integer) 4
127.0.0.1:6379> rpush sql oracle
(integer) 5
127.0.0.1:6379> rpush sql rabbitmq
(integer) 6
127.0.0.1:6379> lrange sql 0 6  #开始的位置 结束的位置
1) "mongodb"
2) "redis"
3) "mysql"
4) "sqlserver"
5) "oracle"
6) "rabbitmq"



127.0.0.1:6379> lpop sql #移除左侧第一个元素
"mongodb"
127.0.0.1:6379> lrange sql 0 6  #开始的位置 结束位置 下标 redis下标从0开始
1) "redis"
2) "mysql"
3) "sqlserver"
4) "oracle"
5) "rabbitmq"

127.0.0.1:6379> rpop sql #移除右侧第一个元素
"rabbitmq"
127.0.0.1:6379> lrange sql 0 6  
1) "redis"
2) "mysql"
3) "sqlserver"
4) "oracle"

127.0.0.1:6379> lindex sql 0  #根据索引查看制定key的元素
"redis"
127.0.0.1:6379> lindex sql 1
"mysql"
127.0.0.1:6379> lindex sql 1
"mysql"
127.0.0.1:6379> lindex sql 2
"sqlserver"
127.0.0.1:6379> lindex sql 3
"oracle"

127.0.0.1:6379> llen sql #查看制定key的列表有多少个元素
(integer) 4

lset key 索引值 元素
127.0.0.1:6379> lset sql 3 mysql
OK

#原来 索引为3的元素 就被mysql覆盖了 原来的mysql还在

 

set 无序集合

元素唯一性

127.0.0.1:6379> sadd redis one two three
(integer) 3  #表名三个都已经存进去了
127.0.0.1:6379> SMEMBERS redis #取出所有的元素
1) "three"
2) "one"
3) "two"
127.0.0.1:6379> sadd redis one two three #因为已经存在 所以返回0
(integer) 0

127.0.0.1:6379> sadd mysql one two three four five
(integer) 5
127.0.0.1:6379> SDIFF redis mysql  #求差集  
#谁在前面结果不一样 我有的你有那么返回空 我有的你没有 返回我有的
(empty list or set)
127.0.0.1:6379> SDIFF mysql redis
1) "five"
2) "four"

127.0.0.1:6379> SINTER redis mysql  #求交集 顺序无所谓
1) "three"
2) "one"
3) "two"


127.0.0.1:6379> sunion mysql redis #合集  
1) "one"
2) "five"
3) "four"
4) "three"
5) "two"

127.0.0.1:6379> sismember mysql four #4是否是mysql中的元素 是返回1 否返回0
(integer) 1
127.0.0.1:6379> sismember mysql six
(integer) 0

 

zset 有序集合

元素唯一性

分数值可以重复

秒杀

zadd key score member
127.0.0.1:6379> zadd z1 0 zero
(integer) 1
127.0.0.1:6379> zadd z1 1 one
(integer) 1
127.0.0.1:6379> zadd z1 2 two
(integer) 1

127.0.0.1:6379> zrange z1 0 2 #类似于list 中的 lrange
1) "zero"
2) "one"
3) "two"


127.0.0.1:6379> ZRANGEBYSCORE z1 0 1
1) "zero"
2) "one"


127.0.0.1:6379> zadd z1 1 mysql #分数值可以重复
(integer) 1
127.0.0.1:6379> zadd z1 1 redis
(integer) 1
127.0.0.1:6379> zadd z1 1 kangbazi
(integer) 1
127.0.0.1:6379> zadd z1 1 redis  #元素不能重复 重复则返回0
(integer) 0


127.0.0.1:6379> zcount z1 1 1   #最小分数值 最大分数值   分数值区间对应的元素数量
(integer) 4 #分数为1 的元素有4个


127.0.0.1:6379> zscore z1 mysql #查看 指定key z1 对应的权重
"1"
127.0.0.1:6379> zcard z1  #指定key下面有多少个元素  
(integer) 6

 

redis 事务

事务就是一个操作

  • 原子性 要么全部执行 要么全部不执行

  • 隔离性 一个操作进行中 不能被其它操作打扰 按顺序进行

#开启事务 
127.0.0.1:6379> multi  #开启事务


127.0.0.1:6379> set name kangbazi
QUEUED
127.0.0.1:6379> set test test
QUEUED
127.0.0.1:6379> set qfedu qdedu
QUEUED

127.0.0.1:6379> exec   #执行事务 里边的命令顺序执行 
1) OK
2) OK
3) OK



127.0.0.1:6379> discard  #取消事务 

127.0.0.1:6379> watch mxl #监视指定的key  如果执行事务之前 key被修改  那么事务会被中断 

unwatch 取消监控  

发布和订阅

a窗口:  订阅
	redis-cli -h 127.0.0.1 -p 6379
	subscribe 频道名称  
	这里就可以看到 b窗口发不来的消息
	
b窗口  发布
	redis-cli -h 127.0.0.1 -p 6379
	publish 频道名称 信息

 

Python操作redis

git clone https://github.com/andymccurdy/redis-py.git cd redis-py/ python setup.py install

import redis 
r = redis.StrictRedis(host='127.0.0.1',port=6379,db=0,password='123456') 
#如果打印出来的结果是 b'内容' 说明是bytes类型  如果想转化成 str 
#需要加参数 decode_responses=True

r.set('name','kangbazi')
print(r.get('name'))

 

设置过期时间

import redis 
res = redis.StrictRedis(host='127.0.0.1',port=6379,db=0,password='123456')

res.set('username','kangbazi666',ex=30)
print(res.get('username'))

 

操作redis list类型

import redis 
relist = redis.StrictRedis(host='127.0.0.1',port=6379,db=0,password='123456')
relist.lpush('language','python')
relist.lpush('language','linux')
relist.rpush('language','javascript')

print(relist.lrange('language',0,-1))

 

操作redis hash类型

import redis 
rehashs = redis.StrictRedis(host='127.0.0.1',port=6379,db=0,password='123456')
rehashs.hset('website','qfedu','qfedu.com')
rehashs.hset('website','91','91.com')
rehashs.hmset('users',{'username':'kangbazi','password':'66666'})
print(rehashs.hgetall('website')) #属性和值
print(rehashs.hkeys('website')) #只取属性

print(rehashs.hvals('website'))#只取值

事务的操作

import redis 
reshiwu = redis.StrictRedis(host='127.0.0.1',port=6379,db=0,password='123456')

pip = reshiwu.pipeline()
reshiwu.set('num1','1')
reshiwu.set('num2','2')

pip.incr('num1')
print(reshiwu.get('num1'))
pip.decr('num2')
print(reshiwu.get('num2'))
pip.execute()

猜你喜欢

转载自www.cnblogs.com/quietzpc/p/12202900.html