sql >> Database teknologi >  >> NoSQL >> Redis

Redis Lua script, der implementerer CAS (check-and-set)?

Du vil være fin med hensyn til atomicitet ifølge Redis's dokumentation:

Redis bruger den samme Lua-fortolker til at køre alle kommandoerne. Redis garanterer også, at et script udføres på en atomart måde:intet andet script eller Redis-kommando vil blive eksekveret, mens et script udføres. Denne semantik ligner den for MULTI / EXEC. Fra alle de andre klienters synspunkt er virkningerne af et script enten stadig ikke synlige eller allerede afsluttet.

Men hvis scriptet er for langsomt, forårsager det problemer. Så script er det bedste til lette operationer, der kræver noget logik og atomicitet.

Et andet smuthul, du måske falder i, er, at hvis scriptet på en eller anden måde fejlede i midten, kunne de opkald, du har foretaget, ikke rulles tilbage, selvom scriptet vil returnere fejl.

F.eks.:Du har et script som dette:

redis.call('set', 'foo', 1)
redis.call('rpush', 'foo', 2)

Scriptudførelsen vil returnere fejl, men foo er allerede indstillet i redis som 1 .

Noget, der ikke er relateret til dit spørgsmål:Jeg har bemærket, at du brugte

eval "your_raw_code" key_count keys argv

faktisk kan du kalde lua script-filen i eval, når du er i terminalen:

> redis-cli eval "$(cat path/to/script/script_name.lua)" key_count keys argv



  1. Bedste praksis for at opgradere Redis med Sentinels?

  2. Sådan begrænser du antallet af opdateringsdokumenter i mongodb

  3. Konverter streng til MongoDB BsonDocument

  4. Batchindsættelse/opdatering ved hjælp af Mongoid?