Redis入门

2018-07-02  本文已影响8人  Marlon666

Redis

Redis简单介绍

Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库

1)Redis是一个远程内存数据库,性能强劲;
2)非关系数据库(non-relational database);
3)先进的key-value持久化产品。它通常被称为数据结构服务器,它的值可以是字符串(String)、
哈希(Map)、列表(List)、集合(Sets)和有序集合(Sorted sets)等类型。
4)可以将存储在内存的键值对数据持久化到硬盘
5)用Redis容易的搭建master-slave架构用于数据复制。

Redis 命令

Redis 单机实例配置

1)redis.conf 配置文件
2)port 端口
3)requirepass
4)masterauth 主从同步在slave配置master的密码

在安装目录下执行该命令

单实例服务器端启动方式

redis-server

redis-server${redis.conf}

redis-server --port${port} 端口号

Ctrl + C    终止命令,该操作不建议,因为不执行保存操作 

单实例客户端启动方式

redis-cli

redis-cli -p ${port}

redis-cli -h ${ip} 

redis-cli -a${password}

redis-cli -p${port} -h${ip} -a ${password}

redis-cli shutdown (关闭6379端口,进行持久化)

redis-cli -p${port} shutdown  (指定端口shutdown)

redis-cli -h${ip} shutdown  (指定IP shutdown)

redis-cli -p${port} -h${ip} shutdown (指定ip和端口)

Ctrl + C   终止命令,该操作不建议,因为不执行保存操作 
shutdown 操作会持久化,否则不会持久化

Redis 基础命令

info  查看系统信息

ping  确认链接。返回为Pong链接成功,否则失败。

quit  退出命令、退出client 链接

save  把数据保存到磁盘上/人工触发的对redis进行持久化

dbsize 当前Space数量

select  选择数据库

flushdb  清除当前的Keyspace

flushall 清除所有的Keyspace

clear 清除命令记录

Redis 键命令

set key  value

del key

exists key  1 存在 
            0 不存在

expire key  10  设置key的过期时间为10秒

ttl   查看当前key的生存时间,单位是秒;
      - 1 没有设置过期时间;
      - 2 已经过期了;

type  key  返回key的数据类型

randomkey  随机的key

rename  key key2  把key命名为key2(直接去覆盖)

-nx  以nx结尾的都是比较特殊的,里边都会有一些判断的逻辑

常用操作命令

keys *            查看所有的key

keys my?          查看已my为开头的key

del my1  my2 my3  删除key

exists  my1       判断key是否存在
                  1 存在
                  0 是不存在

reanme  key newkey  重命名Key

expire key  1000    设置过期时间   

ttl key   查询剩余的时间(相对于过期时间而言)
          没有设置返回-1

type key  获得key的制定类型

常用数据结构

image.png

存储字符串

key定义注意事项:
1)不要太长 不要超过1024字节,否则会降低效率;
2)也不要太短,降低可读性;
3)有一个统一的命名规范

存储String:
1)二进制操作;
2)value最大为512M;

set company banma       设置键值
get company             获取值

getset commpany  baidu  先获取在设置

del commpany            删除键值

incr com                对一个数值类型的对象 递增1; 如果没有就是默认初始值0,然后加1,为1;
decr com                递减1;如果没有这个值,默认为0 减去1,为负1;

incrby num 5            num(默认值为0) 的值加5;
decrby num 5            num(默认值为0) 的值减5;

append num 5            不存在num键,创建一个num为5(字符串)的键值;在num后追加一个5的字符串,然后返回字符串的长度;

存储Hash

1)String Key 和 String Value的map容器;
2)可以存储对象

hset myhash  username peijinliang    往名叫myhash的Hash中存储一个key为username,value为peijinliang
hmset myhash username rose age 12    一次设置多个键值

hget myhash  username                获取myhash中键为username的value
hmget myhash username age            获取多个键值

hgetall myhash                       一次获取全部属性和值

hdel  myhash  username               删除myhash中一个属性为username的属性和值

del myhash                           删除整个hash

hincrby myhash age 5                 给myhash中属性为key的值增加5

hexists myhash username            判断myhash中是否存在key为username的值
                                   1 存在
                                   2 不存在
                                   
hlen myhash                        获取myhash中键值的个数
 
hkeys myhash                       获取myhash中所有的属性

hvals myhash                       获取myhash中所有的值 

数据结构List

ArrayList 使用数组方式
LinkedList 使用双向链表
双向链表添加数据
双向链表删除数据

应用场景:完成消息队列中传递

lpush  mylist   a b c d     往链表mylist头部依次添加 a b c d 数据;如果没有自行创建mylist,然后添加;
                            返回为mylist的长度
                            
rpush mylist  3 2 1         从链表mylist右侧(尾部)依次添加 3 2 1
 
lrange mylist  0  10        查询当前链表的数据

lrange mylist  0  -2        查询到右边(尾部)第二个元素(包含第二个元素);


lpop  mylist                弹出左边第一个元素,弹出后列表便没有该元素;

rpop  mylist                从尾部弹出第一个元素,弹出后列表便没有该元素;

llen  mylist                获取链表的长度


lpushx mylist x             往链表的头部添加一个X

rpushx mylist y             往链表的尾部添加一个Y

lrem mylist  2  3           从头到尾部删除两个3 

lrem mylist  0  3           删错里边所有的3

lset mylist  3  mm          在角标为3的后边设置为mm (这个表述有点问题)

lisert mylist  mm before XXX    在mm之前插入XXX

lisert mylist  mm after XXX     在mm之后插入XXX

rpoplpush mylist5 mylist6       把mylist5的尾部数据加入到mylist6头部(这特不太明白)

数据结构Set

与List集合不同,Set不允许出现重复数据

使用场景:
跟踪一些唯一性数据
用于维护数据对象之间的关联关系

sadd myset  a b c  往myset中添加 a b c

srem myset  1  2   从myset删除 1  2

smembers  myset    查看myset中的数据
   
sismember myset a  判断a 是否在myset中
                   1 表示存在
                   0 表示不存在

sdiff mya1 myb1     差集计算 

sinter mya2 myb2    交集计算
                   
sunion mya3 myb3    并集计算

scard myset         获取数量
 
srandmember  myset  随机返回一个成员

sdiffstore my1  my2 my3     把my2和my3的差集存储到my1中去

sinterstore my1  my2 my3    把my2和my3的交集存储到my1中去

sunionstore   my1  my2 my3  把my2和my3的并集存储到my1中去

数据结构Sorted-Set

Sorted-Set 与 Set的区别:Sorted-Set 分数。
Sorted-Set中成员在集合中的位置是有序的。

应用场景:
大型游戏的积分排行榜
微博排名和热点话题
构建索引数据

zadd mysort 60 tom                添加一个元素:分数为60, 值为tom

zadd mysort 60 black              覆盖分数为60的的值

zadd mysort 10 zs  20 ls 30 ww    添加多个元素

zscore mysort zs                  获取zs的分数

zcard mysort                      获取成员的数量

zrem  mysort  zs                  删除成员 zs

zrange mysort 0 -1                查看所有成员

zrange mysort 0 -1 withscores     查看所有成员,并显示分数(正序)

zrevrange mysort 0 -1 withscores   查看所有成员,并显示分数(倒叙)

zremrangebyrank mysort  0 4        根据(位置)范围进行删除
 
zremrangebyscore mysort  80 100    根据(分数)范围进行删除

zrangebyscore mysort 0 100 withscores limit 0 2  根据(分数)范围查询,同时限制一下返回的位置

zincrby mysort 3 ls                给mysort中ls的分数自增3

zcount mysort 80  90               查询mysort中分数80到90之间的个数

数据结构补充

字符串:

setex key 100 value     设置key的时长是100秒,值为value

psetex key 10000 value  设置key的时长是10000毫秒,值为value

getrange key 0 2        获取key 0-2范围内的字符串
 
getset  oldkey  newvalue  设置oldkey的值为newvalue,同时返回oldkey     

mset  k1 v1  k2 v2 k3 v3  同时设置多个键值 

mget  k1 k2 k3            同时获得多个值

setnx  newkey newvalue    当newkey不存在的时候,设置值为newvalue,否则设置失败

strlen  key               获得字符串的长度

msetnx  k1 v1  k2 v2 k3 v3 同时设置多个键值,前提是key不存在,任意一个出错,就设置失败。
                           该命令具有原子性;

哈希hash:

hgetall  key  获取key的所有key和value

hkeys    key  获取key的所有key

hvals    key  获取key的所有value

hlen     key  获取key的key的个数

hmget   map  key1 key2 获取map的key1 和 key2的值

hdel   map  key1  key2 删除map的key1 和 key2

hsetnx  map color red  只有当map中的key不为color时可以设置成功

列表list:

lpush            最后放的一定是在最前排的/最后放的放到队伍的头部

lset list 0 100  把list的第0个元素设置为100

lpop list        移除第一个元素

rpop list        移除最后一个元素

集合set:

smembers set          查看成员value

srandmember set num   返回随机个数的(成员)值    

sismember  set value  查看value是否是set的成员元素
                      1 是
                      0 否

srem set  kay1 key2   移除多个成员元素

spop set              移除一个随机成员元素,并且返回该元素

Reids特性

1)多数据库
一个redis最多支持16个数据库,下标分别是0-15,默认是第0个数据库。

select 数据库名 选择一个数据库

move key 数据库名 把一个key移动到另个一数据中去

2)Redis事务:所有执行语句串行执行,不在执行其他操作,保证操作的原子性。

事务的三个关键字: multi exec discard

multi (开启事务)

具体执行命令队列

exec (执行事务) / discard(回滚)

Redis 持久化

从内存中同步到硬盘中。

1)RDB方式: 默认支持,不需要配置。
在指定时间间隔内将数据写入到磁盘中去。
优势:
只包含一个文件,对于文件备份而言十分完美。
对于灾难恢复方便。
性能最大化,子进程完成数据持久化。
相对于RDB启动速度比较快。

缺点:
数据的高可用性,避免数据丢失,不是一个好的选择。(服务器宕机情况)
数据量过大,子进程操作占用资源,导致主进程卡顿。

redis.conf 配置文件(配置备份文件和路径)

save 900 1 900秒,至少有一个key发生变化
save 300 10 300秒,至少有10个key发生变化
save 60 10000 60秒,至少有10000个key发生变化

dbfilename dump.rdb 保存的文件名

dir ./ 保存的路径(当前文件夹)

2)AOF方式:将以日志的方式记录redis的操作,当服务器重启之后,他会读取该日志去构建redis数据库。

优势:
带来更高的数据安全性。
包含一个格式非常清晰,易于理解的日志文件,用于所有的修改操作。
日志为追加模式,即使宕机,也不会破坏数据,可以通过工具进行回复。

劣势:
对于相同数据文件要比RDB大一些。
根据同步策略上,运行效率上低于RDB。

redis.conf 配置文件(配置备份文件和路径)

appendonly no 需要改成yes
这个时候回产生一个文件,appendonly.aof

同步策略的设置:
appendfsync always 每修改一次就保存到磁盘上
appendfsync everysec 一秒钟写一次
appendfsync no 不同步

3)无持久化:通过配置禁用持久化功能

4)同时使用RDB和AOF方式

Java项目使用Jedis实现缓存

[https://github.com/xetorthio/jedis]

Redis 分布式集群建设

Redis 实现原理

上一篇下一篇

猜你喜欢

热点阅读