Redis笔记

一.NoSql概述 Not Only SQL

High performance高并发读写 传统关系型数据库很难应付

Huge Sorage 海量数据的高效率存储和访问

高可扩展性和高可用性

1.1 四大分类

键值存储 Redis 快速查询,但是数据缺少结构化

列存储 HBase 查找速度快,扩展强,功能相对局限

文档数据 MongoDB

图形数据库

1.2 NoSql的特点

易扩展

灵活的数据模型

高读写性能

二.Redis概述

C语言开发的高性能键值对数据库

支持类型

字符串 散列 列表 有序集合 集合类型

2.1 应用场景

缓存

任务队列

网站访问统计

数据过期处理

应用排行榜

分布式集群架构中的session分离

2.2 Redis的安装

首先安装GCC

如果不指定版本安装,可以yum install redis即可,自动安装

如果需要安装指定版本,需要编译

启动 ./bin/redis-server ./redis.conf

service redis start

关闭 kill -9 redis主进程号 不建议使用

service redis stop

启动客户端

redis-cli

简单使用

输入 ping 返回pong

set name abc 存入name 值为abc

get name 获取name的值

del name 删除name

keys * 查询所有的key

2.3 Jedis入门

是redis官方首选的java客户端开发包 github上可以找到

引入项目

commons-pool

jedis

redis.clients

jedis

2.9.0

jar

compile

测试示例

//1.设置ip地址和端口

Jedis jedis = new Jedis("192.168.1.66",6379);

//2.保存数据

jedis.set("name","linc");

//3.获取数据

String value=jedis.get("name");

//4.释放资源

jedis.close();

连接池方式

//获取连接池的配置对象

JedisPoolConfig config=new JedisPoolConfig();

//设置最大连接数

config.setMaxTotal(30);

//获取连接池

JedisPool jedisPool=new JedisPool(config,"192.168.1.66",6379);

//获得核心对象

Jedis jedis=null;

try{

//通过连接池获得连接

jedis=jedisPool.getResource();

//设置数据

jedis.set("name","张三");

String value=jedis.get("name");

}catch(Exception e){

e.printStackTrace();

}finally{

//释放资源

if(jedis!=null){

jedis.close();

}

if(jedisPool!=null){

jedisPool.close();

}

}

三.Redis的数据结构

五种数据类型

字符串 String

字符串列表 list

哈希 hash

字符串集合 set

有序字符串集合 sorted set

Key定义的注意点

不要过长,也不要过短

统一的命名规范

3.1 存储String

常用命令

赋值 set name linc

改值 getset name zhangsan

取值 get name

删除 del name

扩展命令

数值增减

incr num

get num 数值为1

incr num

get num 数值为2

decr num2 数值为-1

incrby num 6 指定给num增6

decrby num 3 指定给num减3

append num 5 在3的后面追加5这个字符串

3.2 存储Hash

String Key 和String Value的容器

每一个Hash可以存储4294967295个键值对

赋值 hset myhash username jack

hset myhash age 18

hmset myhash2 username rose age 21

取值 hget myhash name

hmget myhash2 username age

hgetall myhash

删除 hdel myhash2 username age

del myhash2 全部删除

增加数字 hincrby myhash age 5

自学命令 hexists myhash username 判断是否存在

hlen myhash 查找一个hash中的属性数量

hkeys myhash 获取所有的key

hvals myhash 获取所有的value

3.3 List

按照插入顺序排序的

ArrayList使用数组方式 查询快 增删慢

LinkedList使用双向链接方式

双向链表中增加数据

双向链表中删除数据

存储list常用命令

两端添加 lpush mylist a b c 将abc从左边放入链表中

rpush mylist2 c d e 将cde从右边放入链表中

查看列表 lrange mylist 0 5 查询从0到5个位置的元素

lrange mylist 0 -1 查询从0到最后一个位置的元素

两端弹出 lpop mylist 从左边弹出

rpop mylist 从右边弹出

获取列表元素个数 llen mylist

扩展命令 lpushx mylist 如果存在mylist则在左边头部插入一个值,如果不存在就不会插入

rpushx mylist 跟lpushx差不多,只是插入是从右边头部插入

lrem mylist3 2 3 在mylist3中从头到尾删除两个3

lrem mylist3 -2 1 从后面往前面删除两个1

lrem mylist3 0 2 删除里面的所有2

lset mylist3 3 mmm 在第三个角标插入mmm

linsert mylist4 before b 11 在b这个元素前插入11

linsert mylist4 after b 11 在b这个元素后面插入11

rpoplpush mylist5 mylist6将mylist5链表尾部的元素弹出并添加到mylist6头部

rpoplpush使用场景

上图

3.4 存储Set

Set不允许出现重复元素的

添加 sadd myset a b c

删除元素 srem myset a b

获得集合中的元素 smembers myset

sismember myset a 判断a是否在myset中

集合中的差集运算 sdiff mya1 mya2 判断差集

集合中的交集运算 sinter mya1 mya2 求交集

并集 sunion mya1 mya2

得到set具体的元素数量 scard myset

随机得到set中的某一个元素 srandmember myset

sdiffstore my1 mya1 mya2 将mya1与mya2相差的值存到my1中

sinterstore my2 mya1 mya2 将mya1与mya2的交集存在my2中

sunionstore my3 mya1 mya2 将mya1与mya2的并集存在my3中

存储set使用场景

跟踪一些唯一性数据

用于维护数据对象之间的关联关系

3.5 存储Storted-Set

Storted-Set和Set的区别

Storted-Set中的成员在集合中的位置是有序的

常用命令

添加元素 zadd 70 zs 80 ls 90 ww

zadd 100 zs 这里会用新的分数替换原有的分数 这里不显示zs

获取元素 zscore mysort zs 获得zs的分数

zcard mysort 获得具体成员的数量

zrange mysort 0 -1 范围查找查看所有元素的key

zrange mysort 0 -1 withscores 范围查找查看所有元素的key和score

zrangebyscore 0 100

zrangebyscore 0 100 withscores

zrangebyscore 0 100 withscores limit 0 2 只显示两个

zrevrange mysort 0 -1 由大到小的排序查看所有元素key

zrevrange mysort 0 -1 withscores 由大到小的排序查看所有元素key与score

zscore mysort ls 查看ls的值

zcount mysort 80 90 查看80到90之间的有几个

删除元素 zrem mysort zs ww 删除zs ww

zremrangebyrank mysort 0 4 删除指定范围的元素

zremrangebyscore mysort 80 100 删除指定score范围的元素

修改元素 zincrby mysort 3 ls 给ls加3

适用场景 例如大型游戏积分排名,微博热点排名 构建索引数据

四.Keys的通用操作

keys * 所有的keys的查看

keys my? 查看所有my开头的

del my1 my2 my3 删除key

exists my1 查看my1是否存在

get name

rename name myname 重命名key 将name重命名为myname

expire myname 1000 给某一个key设置有效时间 1000秒

ttl myname 查看剩余的有效时间

type myname 获取key的类型

五.Redis 特性

多数据库

Redis事务

5.1多数据库

最多可以提供16个数据库实例,下标分别从0-15

客户端默认连接的是0号数据库

可以通过select来选择连接哪个数据库

select 1 选择1号数据库

move myset 1 将当前数据库中的myset移动到1号数据库

5.2 Redis事务

某一个命令执行失败,后边的命令还会继续执行

multi 开启事务 类似于session.open

exec 提交 commit

discard 回滚 rollback

六.Redis持久化

两种方式

RDB持久化 默认支持

优势 灾难恢复 启动效率高

劣势 服务器宕机时 数据丢失

配置

AOF持久化

可以同时使用RDB与AOF

无持久化 可以配置禁用 当作缓存用

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180314G1OZLU00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券