redis.go 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537
  1. package redis
  2. import (
  3. "errors"
  4. "fmt"
  5. "strconv"
  6. "time"
  7. red "github.com/go-redis/redis"
  8. "github.com/tal-tech/go-zero/core/breaker"
  9. "github.com/tal-tech/go-zero/core/mapping"
  10. )
  11. const (
  12. ClusterType = "cluster"
  13. NodeType = "node"
  14. Nil = red.Nil
  15. blockingQueryTimeout = 5 * time.Second
  16. readWriteTimeout = 2 * time.Second
  17. slowThreshold = time.Millisecond * 100
  18. )
  19. var ErrNilNode = errors.New("nil redis node")
  20. type (
  21. Pair struct {
  22. Key string
  23. Score int64
  24. }
  25. // Redis defines a redis node/cluster. It is thread-safe.
  26. Redis struct {
  27. Addr string
  28. Type string
  29. Pass string
  30. brk breaker.Breaker
  31. }
  32. RedisNode interface {
  33. red.Cmdable
  34. }
  35. // GeoLocation is used with GeoAdd to add geospatial location.
  36. GeoLocation = red.GeoLocation
  37. // GeoRadiusQuery is used with GeoRadius to query geospatial index.
  38. GeoRadiusQuery = red.GeoRadiusQuery
  39. GeoPos = red.GeoPos
  40. Pipeliner = red.Pipeliner
  41. // Z represents sorted set member.
  42. Z = red.Z
  43. ZStore = red.ZStore
  44. IntCmd = red.IntCmd
  45. FloatCmd = red.FloatCmd
  46. )
  47. func NewRedis(redisAddr, redisType string, redisPass ...string) *Redis {
  48. var pass string
  49. for _, v := range redisPass {
  50. pass = v
  51. }
  52. return &Redis{
  53. Addr: redisAddr,
  54. Type: redisType,
  55. Pass: pass,
  56. brk: breaker.NewBreaker(),
  57. }
  58. }
  59. // Use passed in redis connection to execute blocking queries
  60. // Doesn't benefit from pooling redis connections of blocking queries
  61. func (s *Redis) Blpop(redisNode RedisNode, key string) (string, error) {
  62. if redisNode == nil {
  63. return "", ErrNilNode
  64. }
  65. vals, err := redisNode.BLPop(blockingQueryTimeout, key).Result()
  66. if err != nil {
  67. return "", err
  68. }
  69. if len(vals) < 2 {
  70. return "", fmt.Errorf("no value on key: %s", key)
  71. }
  72. return vals[1], nil
  73. }
  74. func (s *Redis) BlpopEx(redisNode RedisNode, key string) (string, bool, error) {
  75. if redisNode == nil {
  76. return "", false, ErrNilNode
  77. }
  78. vals, err := redisNode.BLPop(blockingQueryTimeout, key).Result()
  79. if err != nil {
  80. return "", false, err
  81. }
  82. if len(vals) < 2 {
  83. return "", false, fmt.Errorf("no value on key: %s", key)
  84. }
  85. return vals[1], true, nil
  86. }
  87. func (s *Redis) Del(keys ...string) (val int, err error) {
  88. err = s.brk.DoWithAcceptable(func() error {
  89. conn, err := getRedis(s)
  90. if err != nil {
  91. return err
  92. }
  93. v, err := conn.Del(keys...).Result()
  94. if err != nil {
  95. return err
  96. }
  97. val = int(v)
  98. return nil
  99. }, acceptable)
  100. return
  101. }
  102. func (s *Redis) Eval(script string, keys []string, args ...interface{}) (val interface{}, err error) {
  103. err = s.brk.DoWithAcceptable(func() error {
  104. conn, err := getRedis(s)
  105. if err != nil {
  106. return err
  107. }
  108. val, err = conn.Eval(script, keys, args...).Result()
  109. return err
  110. }, acceptable)
  111. return
  112. }
  113. func (s *Redis) Exists(key string) (val bool, err error) {
  114. err = s.brk.DoWithAcceptable(func() error {
  115. conn, err := getRedis(s)
  116. if err != nil {
  117. return err
  118. }
  119. v, err := conn.Exists(key).Result()
  120. if err != nil {
  121. return err
  122. }
  123. val = v == 1
  124. return nil
  125. }, acceptable)
  126. return
  127. }
  128. func (s *Redis) Expire(key string, seconds int) error {
  129. return s.brk.DoWithAcceptable(func() error {
  130. conn, err := getRedis(s)
  131. if err != nil {
  132. return err
  133. }
  134. return conn.Expire(key, time.Duration(seconds)*time.Second).Err()
  135. }, acceptable)
  136. }
  137. func (s *Redis) Expireat(key string, expireTime int64) error {
  138. return s.brk.DoWithAcceptable(func() error {
  139. conn, err := getRedis(s)
  140. if err != nil {
  141. return err
  142. }
  143. return conn.ExpireAt(key, time.Unix(expireTime, 0)).Err()
  144. }, acceptable)
  145. }
  146. func (s *Redis) GeoAdd(key string, geoLocation ...*GeoLocation) (val int64, err error) {
  147. err = s.brk.DoWithAcceptable(func() error {
  148. conn, err := getRedis(s)
  149. if err != nil {
  150. return err
  151. }
  152. v, err := conn.GeoAdd(key, geoLocation...).Result()
  153. if err != nil {
  154. return err
  155. }
  156. val = v
  157. return nil
  158. }, acceptable)
  159. return
  160. }
  161. func (s *Redis) GeoDist(key string, member1, member2, unit string) (val float64, err error) {
  162. err = s.brk.DoWithAcceptable(func() error {
  163. conn, err := getRedis(s)
  164. if err != nil {
  165. return err
  166. }
  167. v, err := conn.GeoDist(key, member1, member2, unit).Result()
  168. if err != nil {
  169. return err
  170. }
  171. val = v
  172. return nil
  173. }, acceptable)
  174. return
  175. }
  176. func (s *Redis) GeoHash(key string, members ...string) (val []string, err error) {
  177. err = s.brk.DoWithAcceptable(func() error {
  178. conn, err := getRedis(s)
  179. if err != nil {
  180. return err
  181. }
  182. v, err := conn.GeoHash(key, members...).Result()
  183. if err != nil {
  184. return err
  185. }
  186. val = v
  187. return nil
  188. }, acceptable)
  189. return
  190. }
  191. func (s *Redis) GeoRadius(key string, longitude, latitude float64, query *GeoRadiusQuery) (val []GeoLocation, err error) {
  192. err = s.brk.DoWithAcceptable(func() error {
  193. conn, err := getRedis(s)
  194. if err != nil {
  195. return err
  196. }
  197. v, err := conn.GeoRadius(key, longitude, latitude, query).Result()
  198. if err != nil {
  199. return err
  200. }
  201. val = v
  202. return nil
  203. }, acceptable)
  204. return
  205. }
  206. func (s *Redis) GeoRadiusByMember(key, member string, query *GeoRadiusQuery) (val []GeoLocation, err error) {
  207. err = s.brk.DoWithAcceptable(func() error {
  208. conn, err := getRedis(s)
  209. if err != nil {
  210. return err
  211. }
  212. v, err := conn.GeoRadiusByMember(key, member, query).Result()
  213. if err != nil {
  214. return err
  215. }
  216. val = v
  217. return nil
  218. }, acceptable)
  219. return
  220. }
  221. func (s *Redis) GeoPos(key string, members ...string) (val []*GeoPos, err error) {
  222. err = s.brk.DoWithAcceptable(func() error {
  223. conn, err := getRedis(s)
  224. if err != nil {
  225. return err
  226. }
  227. v, err := conn.GeoPos(key, members...).Result()
  228. if err != nil {
  229. return err
  230. }
  231. val = v
  232. return nil
  233. }, acceptable)
  234. return
  235. }
  236. func (s *Redis) Get(key string) (val string, err error) {
  237. err = s.brk.DoWithAcceptable(func() error {
  238. conn, err := getRedis(s)
  239. if err != nil {
  240. return err
  241. }
  242. if val, err = conn.Get(key).Result(); err == red.Nil {
  243. return nil
  244. } else if err != nil {
  245. return err
  246. } else {
  247. return nil
  248. }
  249. }, acceptable)
  250. return
  251. }
  252. func (s *Redis) GetBit(key string, offset int64) (val int, err error) {
  253. err = s.brk.DoWithAcceptable(func() error {
  254. conn, err := getRedis(s)
  255. if err != nil {
  256. return err
  257. }
  258. v, err := conn.GetBit(key, offset).Result()
  259. if err != nil {
  260. return err
  261. }
  262. val = int(v)
  263. return nil
  264. }, acceptable)
  265. return
  266. }
  267. func (s *Redis) Hdel(key, field string) (val bool, err error) {
  268. err = s.brk.DoWithAcceptable(func() error {
  269. conn, err := getRedis(s)
  270. if err != nil {
  271. return err
  272. }
  273. v, err := conn.HDel(key, field).Result()
  274. if err != nil {
  275. return err
  276. }
  277. val = v == 1
  278. return nil
  279. }, acceptable)
  280. return
  281. }
  282. func (s *Redis) Hexists(key, field string) (val bool, err error) {
  283. err = s.brk.DoWithAcceptable(func() error {
  284. conn, err := getRedis(s)
  285. if err != nil {
  286. return err
  287. }
  288. val, err = conn.HExists(key, field).Result()
  289. return err
  290. }, acceptable)
  291. return
  292. }
  293. func (s *Redis) Hget(key, field string) (val string, err error) {
  294. err = s.brk.DoWithAcceptable(func() error {
  295. conn, err := getRedis(s)
  296. if err != nil {
  297. return err
  298. }
  299. val, err = conn.HGet(key, field).Result()
  300. return err
  301. }, acceptable)
  302. return
  303. }
  304. func (s *Redis) Hgetall(key string) (val map[string]string, err error) {
  305. err = s.brk.DoWithAcceptable(func() error {
  306. conn, err := getRedis(s)
  307. if err != nil {
  308. return err
  309. }
  310. val, err = conn.HGetAll(key).Result()
  311. return err
  312. }, acceptable)
  313. return
  314. }
  315. func (s *Redis) Hincrby(key, field string, increment int) (val int, err error) {
  316. err = s.brk.DoWithAcceptable(func() error {
  317. conn, err := getRedis(s)
  318. if err != nil {
  319. return err
  320. }
  321. v, err := conn.HIncrBy(key, field, int64(increment)).Result()
  322. if err != nil {
  323. return err
  324. }
  325. val = int(v)
  326. return nil
  327. }, acceptable)
  328. return
  329. }
  330. func (s *Redis) Hkeys(key string) (val []string, err error) {
  331. err = s.brk.DoWithAcceptable(func() error {
  332. conn, err := getRedis(s)
  333. if err != nil {
  334. return err
  335. }
  336. val, err = conn.HKeys(key).Result()
  337. return err
  338. }, acceptable)
  339. return
  340. }
  341. func (s *Redis) Hlen(key string) (val int, err error) {
  342. err = s.brk.DoWithAcceptable(func() error {
  343. conn, err := getRedis(s)
  344. if err != nil {
  345. return err
  346. }
  347. v, err := conn.HLen(key).Result()
  348. if err != nil {
  349. return err
  350. }
  351. val = int(v)
  352. return nil
  353. }, acceptable)
  354. return
  355. }
  356. func (s *Redis) Hmget(key string, fields ...string) (val []string, err error) {
  357. err = s.brk.DoWithAcceptable(func() error {
  358. conn, err := getRedis(s)
  359. if err != nil {
  360. return err
  361. }
  362. v, err := conn.HMGet(key, fields...).Result()
  363. if err != nil {
  364. return err
  365. }
  366. val = toStrings(v)
  367. return nil
  368. }, acceptable)
  369. return
  370. }
  371. func (s *Redis) Hset(key, field, value string) error {
  372. return s.brk.DoWithAcceptable(func() error {
  373. conn, err := getRedis(s)
  374. if err != nil {
  375. return err
  376. }
  377. return conn.HSet(key, field, value).Err()
  378. }, acceptable)
  379. }
  380. func (s *Redis) Hsetnx(key, field, value string) (val bool, err error) {
  381. err = s.brk.DoWithAcceptable(func() error {
  382. conn, err := getRedis(s)
  383. if err != nil {
  384. return err
  385. }
  386. val, err = conn.HSetNX(key, field, value).Result()
  387. return err
  388. }, acceptable)
  389. return
  390. }
  391. func (s *Redis) Hmset(key string, fieldsAndValues map[string]string) error {
  392. return s.brk.DoWithAcceptable(func() error {
  393. conn, err := getRedis(s)
  394. if err != nil {
  395. return err
  396. }
  397. vals := make(map[string]interface{}, len(fieldsAndValues))
  398. for k, v := range fieldsAndValues {
  399. vals[k] = v
  400. }
  401. return conn.HMSet(key, vals).Err()
  402. }, acceptable)
  403. }
  404. func (s *Redis) Hscan(key string, cursor uint64, match string, count int64) (keys []string, cur uint64, err error) {
  405. err = s.brk.DoWithAcceptable(func() error {
  406. conn, err := getRedis(s)
  407. if err != nil {
  408. return err
  409. }
  410. keys, cur, err = conn.HScan(key, cursor, match, count).Result()
  411. return err
  412. }, acceptable)
  413. return
  414. }
  415. func (s *Redis) Hvals(key string) (val []string, err error) {
  416. err = s.brk.DoWithAcceptable(func() error {
  417. conn, err := getRedis(s)
  418. if err != nil {
  419. return err
  420. }
  421. val, err = conn.HVals(key).Result()
  422. return err
  423. }, acceptable)
  424. return
  425. }
  426. func (s *Redis) Incr(key string) (val int64, err error) {
  427. err = s.brk.DoWithAcceptable(func() error {
  428. conn, err := getRedis(s)
  429. if err != nil {
  430. return err
  431. }
  432. val, err = conn.Incr(key).Result()
  433. return err
  434. }, acceptable)
  435. return
  436. }
  437. func (s *Redis) Incrby(key string, increment int64) (val int64, err error) {
  438. err = s.brk.DoWithAcceptable(func() error {
  439. conn, err := getRedis(s)
  440. if err != nil {
  441. return err
  442. }
  443. val, err = conn.IncrBy(key, int64(increment)).Result()
  444. return err
  445. }, acceptable)
  446. return
  447. }
  448. func (s *Redis) Keys(pattern string) (val []string, err error) {
  449. err = s.brk.DoWithAcceptable(func() error {
  450. conn, err := getRedis(s)
  451. if err != nil {
  452. return err
  453. }
  454. val, err = conn.Keys(pattern).Result()
  455. return err
  456. }, acceptable)
  457. return
  458. }
  459. func (s *Redis) Llen(key string) (val int, err error) {
  460. err = s.brk.DoWithAcceptable(func() error {
  461. conn, err := getRedis(s)
  462. if err != nil {
  463. return err
  464. }
  465. v, err := conn.LLen(key).Result()
  466. if err != nil {
  467. return err
  468. }
  469. val = int(v)
  470. return nil
  471. }, acceptable)
  472. return
  473. }
  474. func (s *Redis) Lpop(key string) (val string, err error) {
  475. err = s.brk.DoWithAcceptable(func() error {
  476. conn, err := getRedis(s)
  477. if err != nil {
  478. return err
  479. }
  480. val, err = conn.LPop(key).Result()
  481. return err
  482. }, acceptable)
  483. return
  484. }
  485. func (s *Redis) Lpush(key string, values ...interface{}) (val int, err error) {
  486. err = s.brk.DoWithAcceptable(func() error {
  487. conn, err := getRedis(s)
  488. if err != nil {
  489. return err
  490. }
  491. v, err := conn.LPush(key, values...).Result()
  492. if err != nil {
  493. return err
  494. }
  495. val = int(v)
  496. return nil
  497. }, acceptable)
  498. return
  499. }
  500. func (s *Redis) Lrange(key string, start int, stop int) (val []string, err error) {
  501. err = s.brk.DoWithAcceptable(func() error {
  502. conn, err := getRedis(s)
  503. if err != nil {
  504. return err
  505. }
  506. val, err = conn.LRange(key, int64(start), int64(stop)).Result()
  507. return err
  508. }, acceptable)
  509. return
  510. }
  511. func (s *Redis) Lrem(key string, count int, value string) (val int, err error) {
  512. err = s.brk.DoWithAcceptable(func() error {
  513. conn, err := getRedis(s)
  514. if err != nil {
  515. return err
  516. }
  517. v, err := conn.LRem(key, int64(count), value).Result()
  518. if err != nil {
  519. return err
  520. }
  521. val = int(v)
  522. return nil
  523. }, acceptable)
  524. return
  525. }
  526. func (s *Redis) Mget(keys ...string) (val []string, err error) {
  527. err = s.brk.DoWithAcceptable(func() error {
  528. conn, err := getRedis(s)
  529. if err != nil {
  530. return err
  531. }
  532. v, err := conn.MGet(keys...).Result()
  533. if err != nil {
  534. return err
  535. }
  536. val = toStrings(v)
  537. return nil
  538. }, acceptable)
  539. return
  540. }
  541. func (s *Redis) Persist(key string) (val bool, err error) {
  542. err = s.brk.DoWithAcceptable(func() error {
  543. conn, err := getRedis(s)
  544. if err != nil {
  545. return err
  546. }
  547. val, err = conn.Persist(key).Result()
  548. return err
  549. }, acceptable)
  550. return
  551. }
  552. func (s *Redis) Pfadd(key string, values ...interface{}) (val bool, err error) {
  553. err = s.brk.DoWithAcceptable(func() error {
  554. conn, err := getRedis(s)
  555. if err != nil {
  556. return err
  557. }
  558. v, err := conn.PFAdd(key, values...).Result()
  559. if err != nil {
  560. return err
  561. }
  562. val = v == 1
  563. return nil
  564. }, acceptable)
  565. return
  566. }
  567. func (s *Redis) Pfcount(key string) (val int64, err error) {
  568. err = s.brk.DoWithAcceptable(func() error {
  569. conn, err := getRedis(s)
  570. if err != nil {
  571. return err
  572. }
  573. val, err = conn.PFCount(key).Result()
  574. return err
  575. }, acceptable)
  576. return
  577. }
  578. func (s *Redis) Pfmerge(dest string, keys ...string) error {
  579. return s.brk.DoWithAcceptable(func() error {
  580. conn, err := getRedis(s)
  581. if err != nil {
  582. return err
  583. }
  584. _, err = conn.PFMerge(dest, keys...).Result()
  585. return err
  586. }, acceptable)
  587. }
  588. func (s *Redis) Ping() (val bool) {
  589. // ignore error, error means false
  590. _ = s.brk.DoWithAcceptable(func() error {
  591. conn, err := getRedis(s)
  592. if err != nil {
  593. val = false
  594. return nil
  595. }
  596. v, err := conn.Ping().Result()
  597. if err != nil {
  598. val = false
  599. return nil
  600. }
  601. val = v == "PONG"
  602. return nil
  603. }, acceptable)
  604. return
  605. }
  606. func (s *Redis) Pipelined(fn func(Pipeliner) error) (err error) {
  607. err = s.brk.DoWithAcceptable(func() error {
  608. conn, err := getRedis(s)
  609. if err != nil {
  610. return err
  611. }
  612. _, err = conn.Pipelined(fn)
  613. return err
  614. }, acceptable)
  615. return
  616. }
  617. func (s *Redis) Rpop(key string) (val string, err error) {
  618. err = s.brk.DoWithAcceptable(func() error {
  619. conn, err := getRedis(s)
  620. if err != nil {
  621. return err
  622. }
  623. val, err = conn.RPop(key).Result()
  624. return err
  625. }, acceptable)
  626. return
  627. }
  628. func (s *Redis) Rpush(key string, values ...interface{}) (val int, err error) {
  629. err = s.brk.DoWithAcceptable(func() error {
  630. conn, err := getRedis(s)
  631. if err != nil {
  632. return err
  633. }
  634. v, err := conn.RPush(key, values...).Result()
  635. if err != nil {
  636. return err
  637. }
  638. val = int(v)
  639. return nil
  640. }, acceptable)
  641. return
  642. }
  643. func (s *Redis) Sadd(key string, values ...interface{}) (val int, err error) {
  644. err = s.brk.DoWithAcceptable(func() error {
  645. conn, err := getRedis(s)
  646. if err != nil {
  647. return err
  648. }
  649. v, err := conn.SAdd(key, values...).Result()
  650. if err != nil {
  651. return err
  652. }
  653. val = int(v)
  654. return nil
  655. }, acceptable)
  656. return
  657. }
  658. func (s *Redis) Scan(cursor uint64, match string, count int64) (keys []string, cur uint64, err error) {
  659. err = s.brk.DoWithAcceptable(func() error {
  660. conn, err := getRedis(s)
  661. if err != nil {
  662. return err
  663. }
  664. keys, cur, err = conn.Scan(cursor, match, count).Result()
  665. return err
  666. }, acceptable)
  667. return
  668. }
  669. func (s *Redis) SetBit(key string, offset int64, value int) error {
  670. return s.brk.DoWithAcceptable(func() error {
  671. conn, err := getRedis(s)
  672. if err != nil {
  673. return err
  674. }
  675. _, err = conn.SetBit(key, offset, value).Result()
  676. return err
  677. }, acceptable)
  678. }
  679. func (s *Redis) Sscan(key string, cursor uint64, match string, count int64) (keys []string, cur uint64, err error) {
  680. err = s.brk.DoWithAcceptable(func() error {
  681. conn, err := getRedis(s)
  682. if err != nil {
  683. return err
  684. }
  685. keys, cur, err = conn.SScan(key, cursor, match, count).Result()
  686. return err
  687. }, acceptable)
  688. return
  689. }
  690. func (s *Redis) Scard(key string) (val int64, err error) {
  691. err = s.brk.DoWithAcceptable(func() error {
  692. conn, err := getRedis(s)
  693. if err != nil {
  694. return err
  695. }
  696. val, err = conn.SCard(key).Result()
  697. return err
  698. }, acceptable)
  699. return
  700. }
  701. func (s *Redis) Set(key string, value string) error {
  702. return s.brk.DoWithAcceptable(func() error {
  703. conn, err := getRedis(s)
  704. if err != nil {
  705. return err
  706. }
  707. return conn.Set(key, value, 0).Err()
  708. }, acceptable)
  709. }
  710. func (s *Redis) Setex(key, value string, seconds int) error {
  711. return s.brk.DoWithAcceptable(func() error {
  712. conn, err := getRedis(s)
  713. if err != nil {
  714. return err
  715. }
  716. return conn.Set(key, value, time.Duration(seconds)*time.Second).Err()
  717. }, acceptable)
  718. }
  719. func (s *Redis) Setnx(key, value string) (val bool, err error) {
  720. err = s.brk.DoWithAcceptable(func() error {
  721. conn, err := getRedis(s)
  722. if err != nil {
  723. return err
  724. }
  725. val, err = conn.SetNX(key, value, 0).Result()
  726. return err
  727. }, acceptable)
  728. return
  729. }
  730. func (s *Redis) SetnxEx(key, value string, seconds int) (val bool, err error) {
  731. err = s.brk.DoWithAcceptable(func() error {
  732. conn, err := getRedis(s)
  733. if err != nil {
  734. return err
  735. }
  736. val, err = conn.SetNX(key, value, time.Duration(seconds)*time.Second).Result()
  737. return err
  738. }, acceptable)
  739. return
  740. }
  741. func (s *Redis) Sismember(key string, value interface{}) (val bool, err error) {
  742. err = s.brk.DoWithAcceptable(func() error {
  743. conn, err := getRedis(s)
  744. if err != nil {
  745. return err
  746. }
  747. val, err = conn.SIsMember(key, value).Result()
  748. return err
  749. }, acceptable)
  750. return
  751. }
  752. func (s *Redis) Srem(key string, values ...interface{}) (val int, err error) {
  753. err = s.brk.DoWithAcceptable(func() error {
  754. conn, err := getRedis(s)
  755. if err != nil {
  756. return err
  757. }
  758. v, err := conn.SRem(key, values...).Result()
  759. if err != nil {
  760. return err
  761. }
  762. val = int(v)
  763. return nil
  764. }, acceptable)
  765. return
  766. }
  767. func (s *Redis) Smembers(key string) (val []string, err error) {
  768. err = s.brk.DoWithAcceptable(func() error {
  769. conn, err := getRedis(s)
  770. if err != nil {
  771. return err
  772. }
  773. val, err = conn.SMembers(key).Result()
  774. return err
  775. }, acceptable)
  776. return
  777. }
  778. func (s *Redis) Spop(key string) (val string, err error) {
  779. err = s.brk.DoWithAcceptable(func() error {
  780. conn, err := getRedis(s)
  781. if err != nil {
  782. return err
  783. }
  784. val, err = conn.SPop(key).Result()
  785. return err
  786. }, acceptable)
  787. return
  788. }
  789. func (s *Redis) Srandmember(key string, count int) (val []string, err error) {
  790. err = s.brk.DoWithAcceptable(func() error {
  791. conn, err := getRedis(s)
  792. if err != nil {
  793. return err
  794. }
  795. val, err = conn.SRandMemberN(key, int64(count)).Result()
  796. return err
  797. }, acceptable)
  798. return
  799. }
  800. func (s *Redis) Sunion(keys ...string) (val []string, err error) {
  801. err = s.brk.DoWithAcceptable(func() error {
  802. conn, err := getRedis(s)
  803. if err != nil {
  804. return err
  805. }
  806. val, err = conn.SUnion(keys...).Result()
  807. return err
  808. }, acceptable)
  809. return
  810. }
  811. func (s *Redis) Sunionstore(destination string, keys ...string) (val int, err error) {
  812. err = s.brk.DoWithAcceptable(func() error {
  813. conn, err := getRedis(s)
  814. if err != nil {
  815. return err
  816. }
  817. v, err := conn.SUnionStore(destination, keys...).Result()
  818. if err != nil {
  819. return err
  820. }
  821. val = int(v)
  822. return nil
  823. }, acceptable)
  824. return
  825. }
  826. func (s *Redis) Sdiff(keys ...string) (val []string, err error) {
  827. err = s.brk.DoWithAcceptable(func() error {
  828. conn, err := getRedis(s)
  829. if err != nil {
  830. return err
  831. }
  832. val, err = conn.SDiff(keys...).Result()
  833. return err
  834. }, acceptable)
  835. return
  836. }
  837. func (s *Redis) Sdiffstore(destination string, keys ...string) (val int, err error) {
  838. err = s.brk.DoWithAcceptable(func() error {
  839. conn, err := getRedis(s)
  840. if err != nil {
  841. return err
  842. }
  843. v, err := conn.SDiffStore(destination, keys...).Result()
  844. if err != nil {
  845. return err
  846. }
  847. val = int(v)
  848. return nil
  849. }, acceptable)
  850. return
  851. }
  852. func (s *Redis) Ttl(key string) (val int, err error) {
  853. err = s.brk.DoWithAcceptable(func() error {
  854. conn, err := getRedis(s)
  855. if err != nil {
  856. return err
  857. }
  858. duration, err := conn.TTL(key).Result()
  859. if err != nil {
  860. return err
  861. }
  862. val = int(duration / time.Second)
  863. return nil
  864. }, acceptable)
  865. return
  866. }
  867. func (s *Redis) Zadd(key string, score int64, value string) (val bool, err error) {
  868. err = s.brk.DoWithAcceptable(func() error {
  869. conn, err := getRedis(s)
  870. if err != nil {
  871. return err
  872. }
  873. if v, err := conn.ZAdd(key, red.Z{
  874. Score: float64(score),
  875. Member: value,
  876. }).Result(); err != nil {
  877. return err
  878. } else {
  879. val = v == 1
  880. return nil
  881. }
  882. }, acceptable)
  883. return
  884. }
  885. func (s *Redis) Zadds(key string, ps ...Pair) (val int64, err error) {
  886. err = s.brk.DoWithAcceptable(func() error {
  887. conn, err := getRedis(s)
  888. if err != nil {
  889. return err
  890. }
  891. var zs []red.Z
  892. for _, p := range ps {
  893. z := red.Z{Score: float64(p.Score), Member: p.Key}
  894. zs = append(zs, z)
  895. }
  896. v, err := conn.ZAdd(key, zs...).Result()
  897. if err != nil {
  898. return err
  899. }
  900. val = v
  901. return nil
  902. }, acceptable)
  903. return
  904. }
  905. func (s *Redis) Zcard(key string) (val int, err error) {
  906. err = s.brk.DoWithAcceptable(func() error {
  907. conn, err := getRedis(s)
  908. if err != nil {
  909. return err
  910. }
  911. v, err := conn.ZCard(key).Result()
  912. if err != nil {
  913. return err
  914. }
  915. val = int(v)
  916. return nil
  917. }, acceptable)
  918. return
  919. }
  920. func (s *Redis) Zcount(key string, start, stop int64) (val int, err error) {
  921. err = s.brk.DoWithAcceptable(func() error {
  922. conn, err := getRedis(s)
  923. if err != nil {
  924. return err
  925. }
  926. v, err := conn.ZCount(key, strconv.FormatInt(start, 10), strconv.FormatInt(stop, 10)).Result()
  927. if err != nil {
  928. return err
  929. }
  930. val = int(v)
  931. return nil
  932. }, acceptable)
  933. return
  934. }
  935. func (s *Redis) Zincrby(key string, increment int64, field string) (val int64, err error) {
  936. err = s.brk.DoWithAcceptable(func() error {
  937. conn, err := getRedis(s)
  938. if err != nil {
  939. return err
  940. }
  941. v, err := conn.ZIncrBy(key, float64(increment), field).Result()
  942. if err != nil {
  943. return err
  944. }
  945. val = int64(v)
  946. return nil
  947. }, acceptable)
  948. return
  949. }
  950. func (s *Redis) Zscore(key string, value string) (val int64, err error) {
  951. err = s.brk.DoWithAcceptable(func() error {
  952. conn, err := getRedis(s)
  953. if err != nil {
  954. return err
  955. }
  956. v, err := conn.ZScore(key, value).Result()
  957. if err != nil {
  958. return err
  959. }
  960. val = int64(v)
  961. return nil
  962. }, acceptable)
  963. return
  964. }
  965. func (s *Redis) Zrank(key, field string) (val int64, err error) {
  966. err = s.brk.DoWithAcceptable(func() error {
  967. conn, err := getRedis(s)
  968. if err != nil {
  969. return err
  970. }
  971. val, err = conn.ZRank(key, field).Result()
  972. return err
  973. }, acceptable)
  974. return
  975. }
  976. func (s *Redis) Zrem(key string, values ...interface{}) (val int, err error) {
  977. err = s.brk.DoWithAcceptable(func() error {
  978. conn, err := getRedis(s)
  979. if err != nil {
  980. return err
  981. }
  982. v, err := conn.ZRem(key, values...).Result()
  983. if err != nil {
  984. return err
  985. }
  986. val = int(v)
  987. return nil
  988. }, acceptable)
  989. return
  990. }
  991. func (s *Redis) Zremrangebyscore(key string, start, stop int64) (val int, err error) {
  992. err = s.brk.DoWithAcceptable(func() error {
  993. conn, err := getRedis(s)
  994. if err != nil {
  995. return err
  996. }
  997. v, err := conn.ZRemRangeByScore(key, strconv.FormatInt(start, 10),
  998. strconv.FormatInt(stop, 10)).Result()
  999. if err != nil {
  1000. return err
  1001. }
  1002. val = int(v)
  1003. return nil
  1004. }, acceptable)
  1005. return
  1006. }
  1007. func (s *Redis) Zremrangebyrank(key string, start, stop int64) (val int, err error) {
  1008. err = s.brk.DoWithAcceptable(func() error {
  1009. conn, err := getRedis(s)
  1010. if err != nil {
  1011. return err
  1012. }
  1013. v, err := conn.ZRemRangeByRank(key, start, stop).Result()
  1014. if err != nil {
  1015. return err
  1016. }
  1017. val = int(v)
  1018. return nil
  1019. }, acceptable)
  1020. return
  1021. }
  1022. func (s *Redis) Zrange(key string, start, stop int64) (val []string, err error) {
  1023. err = s.brk.DoWithAcceptable(func() error {
  1024. conn, err := getRedis(s)
  1025. if err != nil {
  1026. return err
  1027. }
  1028. val, err = conn.ZRange(key, start, stop).Result()
  1029. return err
  1030. }, acceptable)
  1031. return
  1032. }
  1033. func (s *Redis) ZrangeWithScores(key string, start, stop int64) (val []Pair, err error) {
  1034. err = s.brk.DoWithAcceptable(func() error {
  1035. conn, err := getRedis(s)
  1036. if err != nil {
  1037. return err
  1038. }
  1039. v, err := conn.ZRangeWithScores(key, start, stop).Result()
  1040. if err != nil {
  1041. return err
  1042. }
  1043. val = toPairs(v)
  1044. return nil
  1045. }, acceptable)
  1046. return
  1047. }
  1048. func (s *Redis) ZRevRangeWithScores(key string, start, stop int64) (val []Pair, err error) {
  1049. err = s.brk.DoWithAcceptable(func() error {
  1050. conn, err := getRedis(s)
  1051. if err != nil {
  1052. return err
  1053. }
  1054. v, err := conn.ZRevRangeWithScores(key, start, stop).Result()
  1055. if err != nil {
  1056. return err
  1057. }
  1058. val = toPairs(v)
  1059. return nil
  1060. }, acceptable)
  1061. return
  1062. }
  1063. func (s *Redis) ZrangebyscoreWithScores(key string, start, stop int64) (val []Pair, err error) {
  1064. err = s.brk.DoWithAcceptable(func() error {
  1065. conn, err := getRedis(s)
  1066. if err != nil {
  1067. return err
  1068. }
  1069. if v, err := conn.ZRangeByScoreWithScores(key, red.ZRangeBy{
  1070. Min: strconv.FormatInt(start, 10),
  1071. Max: strconv.FormatInt(stop, 10),
  1072. }).Result(); err != nil {
  1073. return err
  1074. } else {
  1075. val = toPairs(v)
  1076. return nil
  1077. }
  1078. }, acceptable)
  1079. return
  1080. }
  1081. func (s *Redis) ZrangebyscoreWithScoresAndLimit(key string, start, stop int64, page, size int) (
  1082. val []Pair, err error) {
  1083. err = s.brk.DoWithAcceptable(func() error {
  1084. if size <= 0 {
  1085. return nil
  1086. }
  1087. conn, err := getRedis(s)
  1088. if err != nil {
  1089. return err
  1090. }
  1091. if v, err := conn.ZRangeByScoreWithScores(key, red.ZRangeBy{
  1092. Min: strconv.FormatInt(start, 10),
  1093. Max: strconv.FormatInt(stop, 10),
  1094. Offset: int64(page * size),
  1095. Count: int64(size),
  1096. }).Result(); err != nil {
  1097. return err
  1098. } else {
  1099. val = toPairs(v)
  1100. return nil
  1101. }
  1102. }, acceptable)
  1103. return
  1104. }
  1105. func (s *Redis) Zrevrange(key string, start, stop int64) (val []string, err error) {
  1106. err = s.brk.DoWithAcceptable(func() error {
  1107. conn, err := getRedis(s)
  1108. if err != nil {
  1109. return err
  1110. }
  1111. val, err = conn.ZRevRange(key, start, stop).Result()
  1112. return err
  1113. }, acceptable)
  1114. return
  1115. }
  1116. func (s *Redis) ZrevrangebyscoreWithScores(key string, start, stop int64) (val []Pair, err error) {
  1117. err = s.brk.DoWithAcceptable(func() error {
  1118. conn, err := getRedis(s)
  1119. if err != nil {
  1120. return err
  1121. }
  1122. if v, err := conn.ZRevRangeByScoreWithScores(key, red.ZRangeBy{
  1123. Min: strconv.FormatInt(start, 10),
  1124. Max: strconv.FormatInt(stop, 10),
  1125. }).Result(); err != nil {
  1126. return err
  1127. } else {
  1128. val = toPairs(v)
  1129. return nil
  1130. }
  1131. }, acceptable)
  1132. return
  1133. }
  1134. func (s *Redis) ZrevrangebyscoreWithScoresAndLimit(key string, start, stop int64, page, size int) (
  1135. val []Pair, err error) {
  1136. err = s.brk.DoWithAcceptable(func() error {
  1137. if size <= 0 {
  1138. return nil
  1139. }
  1140. conn, err := getRedis(s)
  1141. if err != nil {
  1142. return err
  1143. }
  1144. if v, err := conn.ZRevRangeByScoreWithScores(key, red.ZRangeBy{
  1145. Min: strconv.FormatInt(start, 10),
  1146. Max: strconv.FormatInt(stop, 10),
  1147. Offset: int64(page * size),
  1148. Count: int64(size),
  1149. }).Result(); err != nil {
  1150. return err
  1151. } else {
  1152. val = toPairs(v)
  1153. return nil
  1154. }
  1155. }, acceptable)
  1156. return
  1157. }
  1158. func (s *Redis) Zrevrank(key string, field string) (val int64, err error) {
  1159. err = s.brk.DoWithAcceptable(func() error {
  1160. conn, err := getRedis(s)
  1161. if err != nil {
  1162. return err
  1163. }
  1164. val, err = conn.ZRevRank(key, field).Result()
  1165. return err
  1166. }, acceptable)
  1167. return
  1168. }
  1169. func (s *Redis) Zunionstore(dest string, store ZStore, keys ...string) (val int64, err error) {
  1170. err = s.brk.DoWithAcceptable(func() error {
  1171. conn, err := getRedis(s)
  1172. if err != nil {
  1173. return err
  1174. }
  1175. val, err = conn.ZUnionStore(dest, store, keys...).Result()
  1176. return err
  1177. }, acceptable)
  1178. return
  1179. }
  1180. func (s *Redis) String() string {
  1181. return s.Addr
  1182. }
  1183. func (s *Redis) scriptLoad(script string) (string, error) {
  1184. conn, err := getRedis(s)
  1185. if err != nil {
  1186. return "", err
  1187. }
  1188. return conn.ScriptLoad(script).Result()
  1189. }
  1190. func acceptable(err error) bool {
  1191. return err == nil || err == red.Nil
  1192. }
  1193. func getRedis(r *Redis) (RedisNode, error) {
  1194. switch r.Type {
  1195. case ClusterType:
  1196. return getCluster(r.Addr, r.Pass)
  1197. case NodeType:
  1198. return getClient(r.Addr, r.Pass)
  1199. default:
  1200. return nil, fmt.Errorf("redis type '%s' is not supported", r.Type)
  1201. }
  1202. }
  1203. func toPairs(vals []red.Z) []Pair {
  1204. pairs := make([]Pair, len(vals))
  1205. for i, val := range vals {
  1206. switch member := val.Member.(type) {
  1207. case string:
  1208. pairs[i] = Pair{
  1209. Key: member,
  1210. Score: int64(val.Score),
  1211. }
  1212. default:
  1213. pairs[i] = Pair{
  1214. Key: mapping.Repr(val.Member),
  1215. Score: int64(val.Score),
  1216. }
  1217. }
  1218. }
  1219. return pairs
  1220. }
  1221. func toStrings(vals []interface{}) []string {
  1222. ret := make([]string, len(vals))
  1223. for i, val := range vals {
  1224. if val == nil {
  1225. ret[i] = ""
  1226. } else {
  1227. switch val := val.(type) {
  1228. case string:
  1229. ret[i] = val
  1230. default:
  1231. ret[i] = mapping.Repr(val)
  1232. }
  1233. }
  1234. }
  1235. return ret
  1236. }