目录
Redis的简介:
是一个开源的使用C语言编写,支持网络,可基于内存亦可持久化的日志key-value数据库[非关系型数据库]。并支持多种语言的API。 注意:非关系型数据库 mysql,oracle,sqlserver,db2关系型数据库。
Redis特性
Redis远程的:分为客户端,服务端。可以分别部署在不同的机器上,通过自定义协议进行传输和交互的。平时说的Redis通常指的是Redis的服务端。
Redis基于内存的:所有数据结构存在内存中。所有操作非常高速。性能优越于硬盘存储的mysql,因为存在内存中,所有也是比较吃内存的。
Redis 非关系型数据库:本质是数据库,存储数据,区别于Mysql。
关系型数据库在存储之前,必须要定义好所谓的数据字典,后续的存储数据按照存储字典来存储,而Redis就不需要了。
Redis应用场景
1.缓存:当系统的接口数据比较慢的时候,可以把系统数据接口的数据缓存起来,当下次取的时候,可以直接从缓存中取就可以了。
2.数据存储:redis有两种非常完备的持久化机制【AOF和RDB】,可以定期将数据持久化硬盘中,保障数据的完整性,安全性。
为什么使用Redis?
们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。
在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。
单线程redis为什么这么快?
(一)纯内存操作
(二)单线程操作,避免了频繁的上下文切换
(三)采用了非阻塞I/O多路复用机制
Redis安装

进入目录之后,需要make 一下,如果报错的话说明c语言环境没有安装,在联网的情况下使用yum安装,gcc 和 g-c++,命令如下,安装完成后,可以查看一下半版信息:
yum -y install gcc
yum -y install gcc-c++
gcc -v
g++ -v
之后,在次make一下,如果把报错的话,使用 make distcelan命令之后,在make。在,make成功之后,执行make install命令,以上的命令分别如下:
make distclean
make
make install
在所有的操作都成功了之后,可以查看redis的默认安装目录。

如下:
[root@redis99 bin]# ll
总用量 26348
-rwxr-xr-x. 1 root root 5580351 10月 29 12:37 redis-benchmark
-rwxr-xr-x. 1 root root 22225 10月 29 12:37 redis-check-aof
-rwxr-xr-x. 1 root root 7829890 10月 29 12:37 redis-check-rdb
-rwxr-xr-x. 1 root root 5709219 10月 29 12:37 redis-cli
lrwxrwxrwx. 1 root root 12 10月 29 12:37 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 7829890 10月 29 12:37 redis-server
之后就可以启动redis的服务了,使用如下的命令:
redis-server
一般的需要设置redis为后台启动:

如果你想要使用window中的客户端访问linux下一些服务程序,比如说Redis的服务的话,必须在Linux下的该服务的端口,在防火墙中对于放行,或者直接关闭防火墙、
Redis的五种数据类型
String :
- 是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。 Map key-value
- String str = “hello”; redis key – value String s = new String(“”);
- String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
- String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M.
List:
- 单键多值
- Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
- 它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

Hash:
- Redis hash 是一个键值对集合。
- Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
- 类似Java里面的Map<String,Object>

Zset:
- Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score) ,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
- 因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。
使用场景:
| 数据类型 | 项目中的应用 | |
| String | 字符串 | 比如说当一个ip地址访问网站超过了预定的次数,可以禁止访问,则这个预定次数就可以使用String来存储 |
| List | 列表 | 实现最新消息信息排列展示【消息队列】 |
| Set | 集合 | 特殊之处在于set是可以自动排重的。比如在微博应用中,每个人的好友存在一个集合(set)中,这样求两个人的共同好友的操作,可能就只需要用求交集命令即可。 |
| Hash | 散列 | 存储用户信息:key(用户ID) + field(属性标签) 操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。很好的解决了问题 |
| Zset | 有序集合 | 以某个条件为权重,比如按顶的次数排序。 需要精准设定过期时间的应用 使用sorted set的设置过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据。 |
非数据类型常用命令
- 切换库
- select 0
- 启动服务器,用客户端访问
- ./redis-server redis.conf
- ./redis-cli
- 测试验证连接是否正常
- ping
- 查看当前库的所有键
- keys *
- 判断key是否存在
- exists <key>
- 查看键的类型
- type <key>
- 删除某个键
- del <key>
- 设置key的过期时间单位为 秒
- expire <key> <seconds>
- 查看还有多少秒过期,-1表示永不过期,-2表示已过期
- ttl <key>
- 查看当前数据库的key的数量
- dbsize
- 清空当前库
- flushdb
- 通杀全部库
- flushall
127.0.0.1:6379> exists s1
(integer) 0
127.0.0.1:6379> exists s2
(integer) 1
127.0.0.1:6379> type s2
set
127.0.0.1:6379> del s2
(integer) 1
127.0.0.1:6379> del s1
(integer) 0
127.0.0.1:6379> del s100
(integer) 0
127.0.0.1:6379> expire s2 10
(integer) 0
127.0.0.1:6379> ttl s2
(integer) -2
127.0.0.1:6379> ttl s2
(integer) -2
127.0.0.1:6379> exists s2
(integer) 0
127.0.0.1:6379> exists s3
(integer) 0
127.0.0.1:6379> exists s4
(integer) 0
127.0.0.1:6379> exists s1
(integer) 0
127.0.0.1:6379> exists l1
(integer) 1
127.0.0.1:6379> expire l1 10
(integer) 1
127.0.0.1:6379> ttl l1
(integer) 4
127.0.0.1:6379> ttl l1
(integer) 3
127.0.0.1:6379> ttl l1
(integer) 2
127.0.0.1:6379> ttl l1
(integer) 1
127.0.0.1:6379> ttl l1
(integer) 1
127.0.0.1:6379> ttl l1
(integer) 0
127.0.0.1:6379> ttl l1
(integer) -2
127.0.0.1:6379> dbsize
(integer) 13
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> dbsize
(integer) 0
127.0.0.1:6379> flushall
OK
String 类型常用命令
- 添加键值对
- set <key>
- 查询对应键值
- get <key>
- 将给定的<value> 追加到原值的末尾
- append <key> <value>
- 获得值的长度
- strlen <key>
- 只有在 key 不存在时设置 key 的值
- setnx <key> <value>
- 将 key 中储存的数字值增1,只能对数字值操作,如果为空,新增值为1
- incr <key>
- 将 key 中储存的数字值减1,只能对数字值操作,如果为空,新增值为-1
- decr <key>
- 将 key 中储存的数字值增减。自定义步长。
- incrby / decrby <key> <步长>
- 同时设置一个或多个 key-value对
- mset <key1> <value1> <key2> <value2> .....
- 同时获取一个或多个 value
- mget <key1> <key2> <key3> .....
- 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
- msetnx <key1> <value1> <key2> <value2> .....
- 获得值的范围
- getrange <key> <起始位置> <结束位置>
- 用 <value> 覆写<key> 所储存的字符串值,从<起始位置>开始。
- setrange <key> <起始位置> <value>
- 设置键值的同时,设置过期时间,单位秒。
- setex <key> <过期时间> <value>
- 以新换旧,设置了新值同时获得旧值
- getset <key> <value>
127.0.0.1:6379> set s1 v1
OK
127.0.0.1:6379> get s1
"v1"
127.0.0.1:6379> append s1 hello
(integer) 7
127.0.0.1:6379> get s1
"v1hello"
127.0.0.1:6379> append s2 world
(integer) 5
127.0.0.1:6379> strlen s2
(integer) 5
127.0.0.1:6379> setnx s2 isea
(integer) 0
127.0.0.1:6379> get s2
"world"
127.0.0.1:6379> setnx s3 isea
(integer) 1
127.0.0.1:6379> get s3
"isea"
127.0.0.1:6379> incr s4
(integer) 1
127.0.0.1:6379> get s4
"1"
127.0.0.1:6379> incr
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> incr s5 2
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> incr s5 1
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> set s6 3
OK
127.0.0.1:6379> incr s6
(integer) 4
127.0.0.1:6379> decr s6
(integer) 3
127.0.0.1:6379> incrby s7 5
(integer) 5
127.0.0.1:6379> get s7
"5"
127.0.0.1:6379> incrby s7 5
(integer) 10
127.0.0.1:6379> mset s8 v8 s9 v9 s10 v10
OK
127.0.0.1:6379> mget s8 s9 s9
1) "v8"
2) "v9"
3) "v9"
127.0.0.1:6379> msetnx ss1 v1 ss2 v2
(integer) 1
127.0.0.1:6379> get ss1 ss2
(error) ERR wrong number of arguments for 'get' command
127.0.0.1:6379> mget ss1 ss2
1) "v1"
2) "v2"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set name isea_you
OK
127.0.0.1:6379> getrange name 0 -1
"isea_you"
127.0.0.1:6379> getrange name 0 3
"isea"
127.0.0.1:6379> setrange name 0 ifsea
(integer) 8
127.0.0.1:6379> get name
"ifseayou"
127.0.0.1:6379> setex age 10 23
OK
127.0.0.1:6379> ttl age
(integer) 7
127.0.0.1:6379> ttl age
(integer) 6
127.0.0.1:6379> ttl age
(integer) 5
127.0.0.1:6379> ttl age
(integer) 4
127.0.0.1:6379> ttl age
(integer) 2
127.0.0.1:6379> ttl age
(integer) -2
127.0.0.1:6379> getset name hailong
"ifseayou"
127.0.0.1:6379> get name
"hailong"
List 类型常用命令
- 从左边/右边插入一个或多个值。
- lpush/rpush <key> <value1> <value2> <value3> ....
- 从左边/右边吐出一个值。值在键在,值光键亡
- lpop/rpop <key>
- 按照索引下标获得元素(从左到右) 元素不会丢失!
- lrange <key> <start> <stop>
- 获得列表长度
- llen <key>
- 在<value>的后面插入<newvalue> 插入值
- linsert <key> before <value> <pivot> <newvalue>
127.0.0.1:6379> lpush l1 v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> lpop l1
"v4"
127.0.0.1:6379> lrange l1 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> lrange l1 0 2
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> lrange l1 0 1
1) "v3"
2) "v2"
127.0.0.1:6379> llen l1
(integer) 3
127.0.0.1:6379> linsert l1 before 2 isea_you
(integer) -1
127.0.0.1:6379> llen l1
(integer) 3
127.0.0.1:6379> linsert l1 before v2 isea_you
(integer) 4
127.0.0.1:6379> linsert l1 after v2 ifseayou
(integer) 5
127.0.0.1:6379> lrange l1 0 -1
1) "v3"
2) "isea_you"
3) "v2"
4) "ifseayou"
5) "v1"
127.0.0.1:6379>
Set 类型常用命令
- 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
- sadd <key> <value1> <value2> .....
- 取出该集合的所有值。
- smembers <key>
- 判断集合<key>是否为含有该<value>值,有返回1,没有返回0
- sismember <key> <value>
- 删除集合中的某个元素。
- srem <key> <value1> <value2> ....
- 随机从该集合中吐出一个值。
- spop <key>
- 随机从该集合中取出n个值,不会从集合中删除。
- srandmember <key> <n>
- 返回两个集合的交集元素。
- sinter <key1> <key2>
- 返回两个集合的并集元素。
- sunion <key1> <key2>
- 返回两个集合的差集元素,返回的结果跟key的顺序有关系
- sdiff <key1> <key2>
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 m1 m2 m3 m4 m5 m6
(integer) 6
127.0.0.1:6379> smembers s1
1) "m1"
2) "m3"
3) "m2"
4) "m5"
5) "m6"
6) "m4"
127.0.0.1:6379> sismember s1 m4
(integer) 1
127.0.0.1:6379> srem s1 m3 m1
(integer) 2
127.0.0.1:6379> smembers s1
1) "m5"
2) "m6"
3) "m4"
4) "m2"
127.0.0.1:6379> spop s1 2
1) "m2"
2) "m5"
127.0.0.1:6379> smembers s1
1) "m6"
2) "m4"
127.0.0.1:6379> srandmember s1 2
1) "m4"
2) "m6"
127.0.0.1:6379> sadd s2 m1 m2 m3 m4 m5 m6 m7 m8
(integer) 8
127.0.0.1:6379> sinter s1 s2
1) "m6"
2) "m4"
127.0.0.1:6379> sunion s1 s2
1) "m8"
2) "m3"
3) "m5"
4) "m6"
5) "m4"
6) "m7"
7) "m1"
8) "m2"
127.0.0.1:6379> sdiff s1 s2
(empty list or set)
127.0.0.1:6379> sdiff s2 s1
1) "m7"
2) "m5"
3) "m3"
4) "m8"
5) "m1"
6) "m2"
Hash 类型常用命令
- 给<key>集合中的 <field>键赋值<value>
- hset <key> <field> <value>
- 从<key1>集合<field> 取出 value
- hget <key1> <field>
- 批量设置hash的值
- hmset <key1> <field1> <value1> <field2> <value2>...
- 批量取出hash的值
- hmget <key1> <field1> <field2>...
- 查看哈希表 key 中,给定域 field 是否存在。 有返回1,没有返回0
- hexists key <field>
- 列出该hash集合的所有field
- hkeys <key>
- 列出该hash集合的所有value
hvals <key>
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> hset h1 name isea_you
(integer) 1
127.0.0.1:6379> hset h2 age 20
(integer) 1
127.0.0.1:6379> hget h1 name
"isea_you"
127.0.0.1:6379> hget h2 age
"20"
127.0.0.1:6379> hmset h3 name isea_you age 20 sex boy
OK
127.0.0.1:6379> hmget h3 name age sex
1) "isea_you"
2) "20"
3) "boy"
127.0.0.1:6379> hexists h3 name
(integer) 1
127.0.0.1:6379> hkeys h3
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hvals h3
1) "isea_you"
2) "20"
3) "boy"
127.0.0.1:6379> flushdb
OK
Zset 类型常用命令(去重+排序)
评分能够重复。
- 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
- zadd <key> <score1> <value1> <score2> <value2>...
- 返回有序集 key 中,下标在<start> <stop>之间的元素带WITHSCORES,可以让分数一起和值返回到结果集。
- zrange <key> <start> <stop> [WITHSCORES]
- WITHSCORES 如果在命令行上加上该选项,则将score 和 value 一同取出,如果不加该选项,则只取value值!
- zrange <key> <start> <stop> [WITHSCORES]
- 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
- zrangebyscore key min max [withscores] [limit offset count]
- zrevrangebyscore key max min [withscores] [limit offset count] 从大到小
- 为元素的score加上增量
- zincrby <key> <increment> <member>
- 删除该集合下,指定值的元素
- zrem <key> <value>
- 统计该集合,分数区间内的元素个数
- zcount <key> <min> <max>
- 返回该值在集合中的排名,从0开始。
- zrank <key> <value>
127.0.0.1:6379> zadd z1 100 java 90 html 96 css 78 node.js 99 php
(integer) 5
127.0.0.1:6379> zrange z1 0 -1
1) "node.js"
2) "html"
3) "css"
4) "php"
5) "java"
127.0.0.1:6379> zrange z1 0 -1 withscores
1) "node.js"
2) "78"
3) "html"
4) "90"
5) "css"
6) "96"
7) "php"
8) "99"
9) "java"
10) "100"
127.0.0.1:6379> zrevrange z1 0 -1 withscores
1) "java"
2) "100"
3) "php"
4) "99"
5) "css"
6) "96"
7) "html"
8) "90"
9) "node.js"
10) "78"
127.0.0.1:6379> zrangebyscore z1 80 100 withscores
1) "html"
2) "90"
3) "css"
4) "96"
5) "php"
6) "99"
7) "java"
8) "100"
127.0.0.1:6379> zrangebyscore z1 80 100
1) "html"
2) "css"
3) "php"
4) "java"
127.0.0.1:6379> zrevrangebyscore z1 80 100
(empty list or set)
127.0.0.1:6379> zrevrangebyscore z1 100 80
1) "java"
2) "php"
3) "css"
4) "html"
127.0.0.1:6379> zincrby z1 -40 java
"60"
127.0.0.1:6379> zrevrange z1 0 -1 withscores
1) "php"
2) "99"
3) "css"
4) "96"
5) "html"
6) "90"
7) "node.js"
8) "78"
9) "java"
10) "60"
127.0.0.1:6379> zcount z1 60 80
(integer) 2
127.0.0.1:6379> zrank z1 php
(integer) 4
127.0.0.1:6379> flushdb
OK
使用IDEA连接Redis
package com.isea.redis;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
public class TestRedis {
@Test
public void connectionTest(){
Jedis jd = new Jedis("192.168.1.103",6379);
System.out.println(jd.ping());
jd.set("name","isea_you");
jd.set("age","20");
System.out.println(jd.get("name"));
}
/*
PONG
isea_you
*/
}
package com.isea.redis;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class TestRedis {
JedisPool jedisPool = null;
Jedis jedis = null;
@Before
public void init(){
jedisPool = new JedisPool("192.168.1.103",6379);
jedis = jedisPool.getResource();
}
@Test
public void connectionTest(){
System.out.println(jedis.ping());
jedis.set("name","isea_you");
jedis.set("age","20");
System.out.println(jedis.get("name"));
}
@After
public void close(){
jedis.close();
jedisPool.close();
}
/*
PONG
isea_you
*/
}

被折叠的 条评论
为什么被折叠?



