Redis
NoSql (Not Only Sql) 非关系型数据库
行式存储数据库 一般的关系型数据库Mysql,Oracle,SqlServer等
列式存储数据库 Cassandra
文档型数据库 MongoDB
key-value型数据库:
Memcached
早期的NoSql数据库
数据在内存中,不能持久化
支持简单的key-value模式
一般作为缓存数据库
Redis
包含了Memcached的大部分功能
数据在内存中,支持持久化,用作备份
除了支持简单的key-value模式,还支持多种数据结构的存储,如list,set,hash, zset
用作缓存数据库一般
一 . Redis 的 安装与启动
$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz$ tar -xzvf redis-5.0.5.tar.gz
$ cd redis-5.0.5
$ make
问题:
make时报错解决:缺少命令gcc..
$ yum install gcc gcc-c++
致命错误:jemalloc/jemalloc.h:没有那个文件或目录
解决方案1 :
$ make MALLOC=libc //注意等号两边不能有空格
解决方案2 :
$ make distclean //在make之前执行此命令$ make
In order to install Redis binaries into /usr/local/bin just use:
$ make install
You can use `make PREFIX=/some/other/directory install` if you wish to use a different destination.
启动redis
$ redis-server
配置redis 后台启动
修改redis.conf 文件:
# By default Redis does not run as a daemon. Use "yes" if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize no
将no 改为 yes
然后:
redis-server redis.conf //此命令可带参数 指定配置文件的位置
查看服务启动与否:
启动成功:
没启动或失败:
二 . redis 服务 命令行接口: redis-cli 客户端
用来和redis服务通信的
127.0.0.1:6379> help @server
BGREWRITEAOF - 异步重写AOF
BGSAVE - 异步保存数据集到磁盘
CLIENT GETNAME - 拿到当前连接名
CLIENT ID - 返回当前连接的客户端ID
CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no] 杀死某个客户端的连接
CLIENT LIST - 拿到所有客户端的链接集合
CLIENT PAUSE timeout 停止处理来自客户端的命令一段时间
CLIENT REPLY ON|OFF|SKIP 指示服务器是否答复命令
CLIENT SETNAME connection-name 设置当前的连接名
......
常用操作:
多实例端口选择:
$ redis-cli -p 6379 //指定服务端口$ 127.0.0.1:6379> ping
PONG
单实例关闭:
$ redis-cli shutdown//或进入redis-cli后在关闭
127.0.0.1:6379> shutdown
指定端口关闭:
$ redis-cli -p 6379 shutdown
2)String类型 操作命令
三 . Redis 相关知识
1) 默认16个数据库,类似数组下标从0开始,初始默认使用0号库
使用命令 select <dbid> 来切换数据库 ,如 select 12
2)统一密码管理,所有库都是同样的密码,要么都OK,要么一个也连接不上
3) Redis 单线程 + 多路IO复用
串行 vs 多线程 + 锁 (Memcached) vs 单线程 + 多路IO复用(Redis)
注:多路复用是指,使用一个线程来检查多个IO请求的就绪状态
四. Redis 五大数据类型
key
Redis 的数据类型: String Set list hash zset(有序Set)
0) 关于键 key 的命令
查看当前库的所有键: $ keys *
判断某个键是否存在: $ exists <key>
查看键的类型: $ type <key>
删除某个键: $ del <key>
为键值设置过期时间,单位秒: expire <key> <seconds>
查看还有多少秒过期,-1表示永不过期,-2 表示已过期 ttl <key>
查看当前数据库的key的数量 : dbsize
清空当前库: flushdb flushall
1) String : 是Redis最基本的类型,一个key 对应一个 value
是二进制安全的。意味着Redis的String可以包含任何数据,比如jpg图片或者序列化的对象
是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
操作命令:
查询对应键值: get <key>
添加键值对: set <key> <value>
将给定的<value>追加到原值的末尾 : append <key> <value>
获得值得长度:strlen <key>
只有在key不存在时设置key的值: setnx <key> <value>
incr <key> : 将key中存储的数字值加1,只能对数字值操作,如果为空,新增值为1
decr <key>: 将key中存储的数字值减1,只能对数字值操作,如果为空,新增值为 -1
incrby/decrby <key> <步长> : 将 key 中储存的数字值增减。自定义步长
mset <key1> <value1> <key2> <value2> ...
mget <key1> <key2> <key3> ...
msetnx <key1><value1> <key2> <value2> ...
getrange <key> <起始位置> <结束位置>
setrange <key> <起始位置> <value> : 用<vlaue>覆写<key>所存储的字符串值,
从<起始位置>开始
setex <key> <过期时间> value: 设置键值的同事,设置过期时间
getset <key> <value>: 设置了新值的同时获得旧值
原子性: 所谓原子操作是指,不会被线程调度机制打断的操作
在单线程中,能够在单条指令中完成的操作都可以认为是原子操作
在多线程中,不能被其他进程或线程打断的操作就叫原子操作
Redis单命令的原子性主要得益于Redis的单线程
2) List , 单键多值
Redis列表是简单的字符串列表,按照插入顺序排序,可以在列表的头部(左边)或者
(右边) 添加一个元素
底层: 是一个双向链表,所以两端操作性能很高,中间的节点性能较差
注意: push / pop 操作 类似于栈,先push的在尾部
操作命令:
lpush/rpush <key> <value1> <value2> ... 从左边或右边插入一个或多个值
lpop/rpop <key> 从左边/右边吐出一个值, 值在键在,值亡键亡
rpoplpush <key1> <key2> 从<key1>列表右边吐出一个值,插入到<key2>列表的左边
lrange <key> <start> <stop> : 按照索引下标获得元素(从左到右)
lindex <key> <index> : 按照索引下标获得元素(从左到右)
llen <key> 获得列表长度
linsert <key> before <value> <newValue> : 在 <value>的前面插入 <newValue>
lrem <key> <n> <value> : 从左边删除n个value(从左到右)
3) Set , 自动排重
Set提供了判断某个成员是否在一个Set集合内的重要接口,List没有
Redis的Set是String类型的无序集合
底层: 是一个value 为 null 的hash表, 所以添加,删除, 查找的复杂度都是O(1)
操作命令:
sadd <key> <value1> <value2> ... 将一个或多个元素加入到集合中,如已存在,则忽略
smembers <key> : 取出该集合的所有值
sismember <key> <value> : 判断集合<key>是否含有该< value>值,有返回1,无返0
scard <key> 返回集合元素个数
srem <key> <value1> <value2> ... 删除集合中的某个元素
spop <key> 随机从该集合中吐出一个元素
srandmember <key> <n> : 随机从该集合中取出n个值, 不会从集合中删除
sinter <key1> <key2> : 返回两个集合的交集元素
sunion <key1> <key2> : 返回两个集合的并集元素
sdiff <key1> <key2> : 返回两个集合的差集元素 sdiff <key2> <key1>
4) hash , 是一个键值对集合
是一个String 类型的field 和 value 的映射表
特别适合用于存储对象
类似于 Java里面的 Map<String, Object>
操作命令:
hset <key> <field> <value> : 给<key> 集合中的 <field>键赋值 <value>
hget <key1> <field> : 从<key1>集合 <field> 取出 value
hmset <key1> <field1> <value1> <field2> <value2> ... 批量设置hash的值
hexists key <filed>
hkeys <key>
hvals <key>
hincrby <key> <field> <increment> : 为哈希表key中的域field的值加上增量increment
hsetnx <key> <field> <value> : 将哈希表key中的域field的值设置为value ,
当且仅当field不存在
5) ZSet (sorted set), 是一个有序的没有重复元素的字符串集合
所有成员都关联了一个评分(score)
评分score用来按照从最低分到最高分的方式排序集合中的成员
成员唯一,评分可以重复
操作命令:
zadd <key> <score1> <value1> <score2> <value2> ...
zrange <key> <start> <stop> [WITHSCORES] by 下标
zrangebyscore key min max [WITHSCORES] by score
zrevrangebyscore key max min [WITHSCORES] [limit offset count]
zincrby <key> <increment> <value>
zrem <key> <value>
zcount <key> <min> <max>
zrank <key> <value> : 返回该值在集合中的排名
五. Redis 的Java客户端 Jedis
1) 导包
<!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.1</version>
</dependency>
2) 连接虚拟机Redis服务注意事项
1. 禁用Linux的防火墙
systemctl stop firewalld
2. redis.conf 中注释掉 bind 127.0.0.1 (60行左右)
protect-mode (80行左右) 设置为 no
3) 测试连通性
public class JedisTest { public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.18.130", 6379);
jedis.select(3); //选择库
Set<String> keys = jedis.keys("*"); //获取键集
String ping = jedis.ping(); //输出 PONG
for (String key : keys) {
System.out.println(jedis.smembers(key)); //Set类型的遍历
}
}
}
以上是 Redis 的全部内容, 来源链接: utcz.com/z/531515.html