Redis文件夹中主要文件:redis-cli redis的客户端;redis-server.exe redis程序;redis-benchmark检测redis性能,包括并发连线等。
Redis默认有16个数据库,select 1选择1号数据库(以此类推);
常用操作
1.dbsize 查询当前数据库(已存储的)容量
2.set name zhangsan(存储键值对(name,zhangsan))
3.get name
4.keys *查询数据库内所有内容
5.flushdb 清空当前库
6.flushall 清空所有库
7. EXISTS name 判断当前key是否存在
8.exists name1 判断name值是否为1
9.move name 1 从一号数据库移除key
10. expire name 15 15秒之后name键值对过期
11.ttl name 承上 离过期还剩几秒
12.type name 查看当前key的类型
String类型:
13.strlen name 查看当前key的长度
14.append key1 "hello" 在当前String类型key1值后加上”hello“(如果key1不存在 则相当于setkey1)
15.mset key1 v2 key2 v2 key3 一次设置多个键值对
16.mget key1 key2 key3 一次取出多个key
17incr tem key值自增
18.decr tem key值自减
19.incrby tem 10 自增步长为10
20.decrby tem 10 自减步长为10
21setex key1 10 wuyifan (set with expire)设置键值对伴随存活时间
22.setnx key2 zhen(set with not exists)若不存在则创建key 存在则报错
23.getset key1 不存在则返回null(同时设置key1),存在则取出并修改为key1
24.getrange key1 0 1 取出字符串子串
List (可以理解为一个双端队列 其实质就是一个链表)
lpush list "one" 从左插入一个key
rpush list "two"
lpop list 从左取出一个key
rpop list
rrange list 0 -1 从右取出所有
lrange list 0 -1
lindex list 1 通过下标取出key
rindex list 1
llen list 返回列表的长度
lrem list 1 value1 移除列表中的一个value1值
ltrim list 1 2 取出list中下标为1,2的key-value(即list中只剩下1,2的key-value)
lset list 0 "dubo" 将列表中指定下标的value值更新为dubo(下标不存在则报错)
exists list 判断列表是否存在
linsert list before one two 在one前面插入two
rpoplpush list1 list2 将list1最右边的value插入到list2最左边
Set (无序集合 不能有重复的元素)
sadd set value1 往set中添加元素
smembers set 返回set的长度
sismember set value1 查询value1是否是set中的元素
scard set 返回set中元素个数
srem set value 删除值为value的元素
srandmember set 随机抽出一个元素
srandmember set 2 随机抽出两个元素
spop set 随机删除元素
smove set1 set2 "hello" 移动指定元素set1-->set2
sdiff set1 set2 两集合差集
sinter set1 set2 交集
sunion set1 set2 并集
hash(Map集合,value是一个map集合,本质与String类型没有太大区别)
hset hash field value 加入一个键值对
hmset hash field1 value1 field2 value2 加入多个键值对
hget hash field 获取一个value
hmget hash field1 field2 获取多个键值对
hgetall hash 获取所有键值对
hdel hash field 删除指定value
hexists hash field 判断hash表中是否存在该字段
hlen hash 返回hash表长度
hkeys hash 获得所有字段
hvals hash 获得所有值
hincrby/hsetnx 与String用法大同小异
zset(有序set集合)
zadd zset 1 wang
zrangebyscore zset -inf +inf(with scores) 排序(带不带下标值)
zrem zset value 移除指定元素
zcard zset 获得元素个数
zrevrange zset 0 -1 逆序排序
zcount zset 1 3 统计指定区间个数
Geospatial(底层实现原理是zset zset命令同样可以用于geo)
geoadd china:city xxxx(经度) xxxxxx(纬度) beijing 添加城市经纬度
geopos china:city beijing 返回坐标值
geodist china:city beijing chongqing km 查询北京到重庆的直线距离
georadius china:city 110 30 500 km(withdist withcoord count 2) 以110 30为中心半径为500km内的元素(显示到中心的距离 显示该元素坐标 输出几个符合条件的元素)
georadiusbymember china:city beijing 500 km 查询位于指定元素周围一定距离的其他元素
Hyperloglog(基数操作)
PFadd key1 a b c d e f g 添加一组元素
pfcount key1 统计基数数量
pfmerge key1 key2 合并两组数据
有一定错误率
Bitmaps(统计用户信息 bitmaps位图 数据结构 操纵二进制位来进行记录 只有0/1两个状态)
setbit sign 0 1 添加数据
getbit sign 0 获得数据
bitcount sign 统计为1的数量
redis是单线程的,因为redis基于内存运行,其性能瓶颈不在于CPU而在于机器内存,网络带宽,既然可以单线程,那就没必要多线程。
Redis具有100000+的QPS(每秒查询数)基于C语言编写,性能强于同样是key-value存储模式的memeache。
Reids是将所有数据放进内存操作的。多线程会让CPU调度切换上下文同样会花费时间,redis作为内存系统,多次读写操作都是在一个CPU上进行的。所以对于Redis来说单线程工作是效率最高的。(速度CPU>内存>硬盘)
Redis被集成于Spring Data中,Spring Data是与springboot齐名的开源框架
首先创建一个springboot程序,在创建选项中的非关系型数据库(no-sql)中选择第一个。
编写测试类测试
@Autowired
RedisTemplate redisTemplate;
@Test
void contextLoads() {
redisTemplate.opsForValue().set("zhang","san");
System.out.println(redisTemplate.opsForValue().get("zhang"));
}
RedisTemplate 操作不同的数据类型,api和我们的指令是一样的。
opsforList
opsforHash
opsforSet
除了基本的方法,我们常用的方法都可以直接通过RedisTemplate操作,比如事务和基本的CRUD
对象必须被序列化后才能存入Redis,若实体类没有implements序列化接口serializable则实例化出的对象无法传递给Redis。objectmapper是springboot自带的一个序列化转义对象。key采用string的序列化方式。
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
//我们为了自己开发方便,一般直接使用<string, object>
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(redisConnectionFactory);
// Json序列化配置
Jackson2JsonRedisSerializer jackson2JsonRedisserializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisserializer.setObjectMapper(om);
// string 的序列化
StringRedisSerializer stringRedisserializer = new StringRedisSerializer();
// key采用string的序列化方式
template.setKeySerializer(stringRedisserializer);
// hash的key也采用string的序列化方式
template.setHashKeySerializer(stringRedisserializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisserializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisserializer);
template.afterPropertiesSet();
return template;
}
}