redis

redis安装

下载:

wget http://download.redis.io/releases/redis-4.0.10.tar.gz

上传至/usr/local

tar xzf redis-3.2.12.tar.gz

修改文件夹名称

mv redis-3.2.12 redis

安装

cd redis

启动src/redis-server

检查端口:

lsof  -i:6379

说明启动成功

客户端连接测试:

src/redis-cli

配置sys-v

cp redis /etc/init.d/

chmod +x /etc/init.d/redis

service redis status

 基本文件配置:

安全配置:

在线变更配置:

 redis持久化功能

RDB

RDB是基于快照的一种持久化功能,保存某个时间点的,key:value状态。
dbfilename dump.rdb
dir /data/redis
save 900 1
save 300 10
save 60 10000

优点:

快速持久化,
占用磁盘空间少,
一般备份是通过RDB实现的,
主从复制功能也是通RDB功能实现的。

缺点:

当断电,重启时,RDB会丢失少部分数据。

AOF

appendonly LogFile,追加模式的日志记录持久化方式。会记录redis中所有变更类的命令。

appendonly yes
appendfsync always
appendfsync everysec

优点:

相对RDB来讲,更加安全了。

缺点:

持久化速度相对较慢,需要更多的存储空间。

数据类型

string
hash
list
set
sorted set

key通用操作

KEYS *                 查看KEY支持通配符
DEL                    删除给定的一个或多个key
EXISTS                 检查是否存在
RENAME                 变更KEY名
TYPE                返回键所存储值的类型
EXPIRE\ PEXPIRE     以秒\毫秒设定生存时间
TTL\ PTTL             以秒\毫秒为单位返回生存时间
PERSIST             取消生存实现设置

STRING

计数器的实现:

incr num     每次累计加1
decr num     每次累计减1

incrby num 10000   累计加10000
decrby num 10000   累计减10000

应用场景:

常规计数:微博数、粉丝数

普通的键值对的使用:

127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> mset id 101 name zhangsan age 20 gender m
OK
127.0.0.1:6379> keys *
1) "name"
2) "id"
3) "xyz"
4) "jishu"
5) "age"
6) "gender"
127.0.0.1:6379> mget id name age gender
1) "101"
View Code

string

set mykey "test"                   为键设置新值,并覆盖原有值
getset mycounter 0               设置值,取值同时进行
setex mykey 10 "hello"          设置指定 Key 的过期时间为10秒,在存活时间可以获取value
setnx mykey "hello"               若该键不存在,则为键设置新值
mset key3  "zyx"  key4 "xyz"      批量设置键

删
del mykey                          删除已有键

改
append mykey "hello"          若该键并不存在,返回当前 Value 的长度
                              该键已经存在,返回追加后 Value的长度
incr mykey                   值增加1,若该key不存在,创建key,初始值设为0,增加后结果为1
decrby  mykey  5               值减少5
setrange mykey 20 dd          把第21和22个字节,替换为dd, 超过value长度,自动补0

查  
exists mykey                 判断该键是否存在,存在返回 1,否则返回0
get mykey                    获取Key对应的value
strlen mykey                  获取指定 Key 的字符长度
ttl mykey                     查看一下指定 Key 的剩余存活时间(秒数)
getrange mykey 1 20          获取第2到第20个字节,若20超过value长度,则截取第2个和后面所有的
mget key3 key4               批量获取键

Hash类型(字典)

增
hset myhash field1 "s"    
若字段field1不存在,创建该键及与其关联的Hashes, Hashes中,key为field1 ,并设value为s ,若存在会覆盖原value
hsetnx myhash field1 s    
若字段field1不存在,创建该键及与其关联的Hashes, Hashes中,key为field1 ,并设value为s, 若字段field1存在,则无效
hmset myhash field1 "hello" field2 "world       一次性设置多个字段
删
hdel myhash field1                       删除 myhash 键中字段名为 field1 的字段
del myhash                              删除键
改  
hincrby myhash field 1                  给field的值加1
查
hget myhash field1                       获取键值为 myhash,字段为 field1 的值
hlen myhash                               获取myhash键的字段数量
hexists myhash field1                     判断 myhash 键中是否存在字段名为 field1 的字段
hmget myhash field1 field2 field3          一次性获取多个字段
hgetall myhash                           返回 myhash 键的所有字段及其值
hkeys myhash                              获取myhash 键中所有字段的名字
hvals myhash                               获取 myhash 键中所有字段的值

应用场景:

存储部分变更的数据,如用户信息等.

List列表

增 
lpush mykey a b              若key不存在,创建该键及与其关联的List,依次插入a ,b, 若List类型的key存在,则插入value中
lpushx mykey2 e              若key不存在,此命令无效, 若key存在,则插入value中
linsert mykey before a a1      在 a 的前面插入新元素 a1
linsert mykey after e e2       在e 的后面插入新元素 e2
rpush mykey a b             在链表尾部先插入b,在插入a
rpushx mykey e              若key存在,在尾部插入e, 若key不存在,则无效
rpoplpush mykey mykey2       将mykey的尾部元素弹出,再插入到mykey2 的头部(原子性的操作)
删
del mykey                      删除已有键 
lrem mykey 2 a               从头部开始找,按先后顺序,值为a的元素,删除数量为2个,若存在第3个,则不删除
ltrim mykey 0 2              从头开始,索引为0,1,2的3个元素,其余全部删除
改
lset mykey 1 e               从头开始, 将索引为1的元素值,设置为新值 e,若索引越界,则返回错误信息
rpoplpush mykey mykey          将 mykey 中的尾部元素移到其头部
查
lrange mykey 0 -1              取链表中的全部元素,其中0表示第一个元素,-1表示最后一个元素。
lrange mykey 0 2            从头开始,取索引为0,1,2的元素
lrange mykey 0 0            从头开始,取第一个元素,从第0个开始,到第0个结束
lpop mykey                  获取头部元素,并且弹出头部元素,出栈
lindex mykey 6              从头开始,获取索引为6的元素 若下标越界,则返回nil 

应用场景:

set集合

127.0.0.1:6379> sadd lxl jnl pg ms mr abc xyz baoqiang yf 
(integer) 8
127.0.0.1:6379> sadd jnl baoqiang yf xyz mr lxl 
(integer) 5
127.0.0.1:6379> SINTER lxl jnl 
1) "mr"
2) "baoqiang"
3) "xyz"
4) "yf"
127.0.0.1:6379> SDIFF lxl jnl 
1) "jnl"
2) "abc"
3) "ms"
4) "pg"
127.0.0.1:6379> SDIFF jnl lxl
1) "lxl"
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> SUNION jnl lxl 
1) "baoqiang"
2) "pg"
3) "xyz"
4) "yf"
5) "lxl"
6) "mr"
7) "jnl"
8) "ms"
9) "abc"

127.0.0.1:6379> SINTERSTORE gthy lxl jnl
(integer) 4
127.0.0.1:6379> SMEMBERS gthy
1) "mr"
2) "baoqiang"
3) "yf"
4) "xyz"
127.0.0.1:6379> 

应用场景:

有序集合

发布订阅:

窗口1:
redis-cli -a 123

SUBSCRIBE   fm1039   订阅单个频道
PSUBSCRIBE   fm*     订阅多个频道

窗口2:

127.0.0.1:6379> PUBLISH fm1039 "hi!"
(integer) 1

127.0.0.1:6379> PUBLISH fm1039 "hi!"
(integer) 1
127.0.0.1:6379> PUBLISH fm1038 "hi!"
(integer) 1
127.0.0.1:6379> PUBLISH fm1037 "hi!"
(integer) 1
127.0.0.1:6379> 

 应用场景:

 示例:

#创建连接池
import redis
pool=redis.ConnectionPool(host="127.0.0.1",port=6379)
r = redis.Redis(connection_pool=pool)



######String操作#############

'''
#1、单个设置和批量设置
 r.setnx('age',899)
 r.mset(k1='v1',k2='v2',k3="v3",k4="v4")

#2、 单个获取和批量获取
 print(r.mget("k1","k2","k3"))


#3、子序列操作
 print(r.getrange("alex",0,2))  ##b'sbs'
 r.setrange("alex",1,"xxx") #在第1个后面插入xxx  结果:"sxxx"


#获取长度
 print(r.strlen("alex"))


#追加
 r.append("alex","sb")
 print(r.get("alex"))  ##b'sbsb'

'''



########Hash操作#####################
"""
###单个设置
r.hset("info","sb","egon") #b'egon'

###批量设置
r.hmset("info",{"name":"alex","age":11,"gender":"male"})
print(r.hmget("info",{"name":"alex","age":11,"gender":"male"}))#[b'alex', b'11', b'male']


 ###查看类型
print(type(r.hgetall("info")))  #<class 'dict'>

##统计长度
print(r.hlen("info"))

##只取keys
print(r.hkeys("info"))  #[b'name', b'sb', b'age', b'gender']


#分片取值 在数据量大的情况下使用最好
print(r.hscan_iter("info"))
for i in r.hscan_iter("info"):
    print(i)

    (b'name', b'alex')
    (b'sb', b'egon')
    (b'age', b'11')
    (b'gender', b'male')
"""

############# 链表操作  ########

# r.lpush("l1",11,22,33)

# r.lpushx("l1",44)
# print(r.llen("l1")) #7
# r.linsert("l1","BEFORE",22,55)


# print(r.lindex("l1",1)) #按照索引取值
# print(r.lindex("l1",0))
# print(r.lindex("l1",1))
# print(r.lindex("l1",2))
# print(r.lindex("l1",3))
# print(r.lindex("l1",4))

# r.lpush("l2",11,22,33)
# print(r.lrange("l2",0,-1))  #切片取值
# print(r.lrange("l1",0,-1))  #切片取值

# r.ltrim("l1",0,4)
# print(r.lrange("l1",0,-1))

# print(r.exists("info"))
View Code

 

posted @ 2018-07-17 10:04  Jacob先生  阅读(172)  评论(0编辑  收藏  举报